Я пытаюсь запустить комбинированный код 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 является правильным