我正在尝试运行调用汇编程序的 C 组合代码,并且收到异常程序终止消息。 代码非常简单,汇编程序扫描一个数字并将结果返回给c。
;main code
#include<stdio.h>
extern long getPnum();
int main()
{
long x;
x = getPnum();
printf("%d", x);
return 0;
}
;getPNum
.MODEL SMALL
.STACK 100H
.DATA
NUM DD 0
.CODE
.386
PUBLIC _getPnum
_getPnum PROC NEAR
PUSH BP
MOV BP,SP
PUSH EAX
PUSH EBX
PUSH ECX
MOV EBX,10
SCAN:
MOV EAX,NUM
MUL EBX
MOV ECX,EAX
XOR EAX,EAX
MOV AH,1
INT 21H
CMP AL,13
JE NEXT
SUB AL,'0'
MOV AH,0
ADD ECX,EAX
MOV NUM,ECX
JMP SCAN
NEXT:
MOV AX,WORD PTR NUM
MOV DX,WORD PTR NUM+2
ADD SP,14
RET
_getPnum ENDP
END
<小时/>
我将 %d
更改为 ld%
,现在我收到另一个错误:Dimdie error
很奇怪,当我运行DEBUGER时,我通过AX DX返回数字,而X得到错误的值
debugger
result scrren
我变了
ADD SP,14
RET
至
ADD SP,12
POP BP
RET
现在我没有收到任何错误,但打印的值不正确,尽管通过 DX:AX 返回的值是正确的
最佳答案
BP
必须在退出程序时恢复。
改变
ADD SP,14
RET
至
ADD SP,12
POP BP
RET
更好的是:
MOV SP, BP
POP BP
RET
顺便说一句:为什么要推送一堆在函数结束时不恢复的寄存器?
关于c - 程序异常终止 Turbo C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52255049/