c - 程序异常终止 Turbo C

标签 c assembly

我正在尝试运行调用汇编程序的 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/

相关文章:

assembly - 如果为正则设置字节

c - C中的字符串复制问题

c - 使用 (void *) 1 而不是 null 作为占位符是否有优势

linux - 带气体组件的 Printf

linux - 如何在 x64 中创建 thunk?

linux - 输入一串字符并输出为大写

c - Arduino 上的左右红外运动传感器

c - 如何打印结构数组?

c - 8051 的 sdcc 编译器的奇怪行为

design-patterns - 汇编语言中的设计模式