Assembly 在x86程序集中跳过了scanf函数

Assembly 在x86程序集中跳过了scanf函数,assembly,x86,scanf,Assembly,X86,Scanf,我试图从键盘上读取一些整数,把它们相加,然后计算结果。 由于某种原因,当我试图读取操作时,它跳过了scanf,因此我无法继续我的程序 以下代码中称之为的部分为: push offset opr_adr push offset opr call scanf add ESP,8 代码是: .386 .model flat, stdcall ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;

我试图从键盘上读取一些整数,把它们相加,然后计算结果。 由于某种原因,当我试图读取操作时,它跳过了scanf,因此我无法继续我的程序

以下代码中称之为的部分为:

push offset opr_adr 
push offset opr 
call scanf 
add ESP,8
代码是:

.386
.model flat, stdcall
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;libraries and functions
includelib msvcrt.lib
extern printf: proc
extern scanf: proc
extern exit: proc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;declare start symbol as public
public start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;sectiunile programului, date, respectiv cod
.data
msg1 db "Base(decimal or hexadecimal): ", 0
msg2 db "Expression: ", 0
msg3 db "Expression(hexadecimal): ", 0

base_adr Db 2 dup(0)     ;base address
baza db "%c",0           ;base, D for decimal, H for hexadecimal

opr_adr Db 4 dup(0),0    ;operator address
opr db "%c",0

nr db 4 dup(0)
number Db "%d",0

result db "%d",0    
rez db 0



.code


start:
push offset msg1
call printf
add ESP, 4

push offset base_adr
push offset baza
call scanf
add ESP, 8

cmp base_adr,'D'
je decimal
cmp base_adr,'H'
jz hexadecimal

decimal:
push offset msg2
call printf
add ESP, 4
jmp decimal_numbers

decimal_numbers:
push offset nr
push offset number
call scanf
mov bx, 0
mov bl,nr
add ESP,8

push offset opr_adr
push offset opr
call scanf
add ESP,8

cmp opr_adr, '+' 
je adunare
cmp opr_adr, '=' 
je result


adunare:
add Al, Bl
jmp decimal_numbers


result:
mov rez, AH
push offset rez
push offset rezultat
call printf
add esp,8


hexadecimal:
push offset msg3
call printf
add ESP,4


;terminarea programului
push 0
call exit
end start

你有没有用调试器检查过你的代码?或者,当编译、执行和后期堆栈溢出无法完美工作时,您是否遵循了该开发模型?我使用了Olly Debugger,但它没有停止到scanf,因此我可以给运算符,我不明白为什么…您是如何构建该程序的?我看到你的符号叫做“开始”-你没有链接libc启动文件吗?我在其他程序中也使用过这个符号,它工作得很好。。。