【问题标题】:abnormal program termination turbo c异常程序终止 turbo c
【发布时间】: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

标签: c assembly


【解决方案1】:

BP必须在您离开程序时恢复。

改变

ADD SP,14
RET

ADD SP,12
POP BP
RET

更好的是:

MOV SP, BP
POP BP
RET

顺便说一句:为什么你要推送一堆你在函数结束时不恢复的寄存器?

【讨论】:

  • 是的,你是对的,我改变了它,但它仍然没有帮助,即使通过 DX 返回的值它打印一个不正确的值:AX 是正确的,X 得到错误的值。我推送所有这些寄存器,因为这是众多程序中的一个,我不知道我是否会使用这些寄存器......
  • @DanielYachnev:这里没有错误。你的控制台输入是什么样的?要打印 LONG,您必须将 printf("%d", x); 更改为 printf("%ld", x);
  • 是的,我已经改过了。X 得到了错误的值,尽管通过 DX:AX 返回的值是正确的
  • @DanielYachnev:对不起,我不能用你发布的代码在这里产生错误的值。 (尝试了很多)。当您开始新的编译运行时,首先尝试删除所有 .EXE 和 .OBJ 文件。离开程序时,至少尝试恢复EBX
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多