【发布时间】:2018-09-10 09:44:42
【问题描述】:
我正在尝试运行调用汇编程序的 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 的返回值是正确的
【问题讨论】:
-
附加调试器的任何更改?
-
为什么代码使用
"%d"来打印long而不是"%ld"?完全启用警告的良好编译器将节省您的时间并对此发出警告。也许与“警告:格式'%d'需要'int'类型的参数,但参数2具有'long int'类型”。这能为您解决问题吗? -
@chux 我试过没用
-
@chux:OP 使用 TurboC,它应该回答关于一个好的编译器的问题。操作。 TurboC 已经过时了 20 多年。它自 19 年以来不符合标准,不应使用。它也不支持现代计算机平台。使用现代工具链,如 gcc 或 clang。如果没有必要,不要使用汇编代码。说:你想实现什么?您尝试使用该代码解决什么问题?
-
@toohonest 这是我们在学校被允许使用的。任务是使用 5 个组装程序检查一个数字是否为 proth