аварийное завершение программы Turbo C - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь запустить комбинированный код 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 Это очень странно, когда я запускаю отладчик, я возвращаю число через AX DX, и X получает неправильное значение отладчик результат scrren


Я изменил

ADD SP,14
RET

до

ADD SP,12
POP BP
RET

и теперь я не получаю никаких ошибок, но напечатанное значение неверно, несмотря на то, что возвращаемое значение через DX: AX является правильным

1 Ответ

0 голосов
/ 10 сентября 2018

BP необходимо восстановить после выхода из процедуры.

Изменить

ADD SP,14
RET

на

ADD SP,12
POP BP
RET

Лучше:

MOV SP, BP
POP BP
RET

Кстати: почему вы нажимаете кучу регистров, которые выне восстановить в конце функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...