Assembly MASM汇编扫描格式

Assembly MASM汇编扫描格式,assembly,Assembly,所以基本上我要做的是创建一个计算器,它接受像3+2*3*4这样的输入并打印出结果。我遇到的问题可能看起来很简单,我基本上是一个汇编初学者,但我真的不知道如何在没有控制台崩溃的情况下扫描像%d%c%d%c%d这样的格式。我不想将其作为字符串扫描,因为我构建了计算器解析器代码,它基于这样一个事实,即我可以使用我希望以“3”、“+”、“2”、“3”、“4”格式扫描的元素进行操作 干杯,新年快乐 进一步编辑:在jcomeau_ictx的帮助下,我终于成功地使它正常工作了,但现在我发现自己陷入了另一个困境

所以基本上我要做的是创建一个计算器,它接受像3+2*3*4这样的输入并打印出结果。我遇到的问题可能看起来很简单,我基本上是一个汇编初学者,但我真的不知道如何在没有控制台崩溃的情况下扫描像%d%c%d%c%d这样的格式。我不想将其作为字符串扫描,因为我构建了计算器解析器代码,它基于这样一个事实,即我可以使用我希望以“3”、“+”、“2”、“3”、“4”格式扫描的元素进行操作

干杯,新年快乐

进一步编辑:在jcomeau_ictx的帮助下,我终于成功地使它正常工作了,但现在我发现自己陷入了另一个困境:我的赋值声明输入可以从2个操作数到4个操作数不等,并且代码只适用于我为sir1分配的DW空间,因此在这种情况下,它总是需要4个操作数才能工作。不过,我可以通过输入0并输入直到它起作用来跨越这个界限

.data
sir1 dd 0,0,0,0,0,0,0
rezultat db "rezultat= %d %c %d %c %d %c %d ",13,10, 0
format db "%d %c %d %c %d %c %d",0
msg1 DB "introduceti sirul: ",13,10, 0
.code
start:

push offset msg1
call printf
add ESP, 4

push offset sir1+24
push offset sir1+20
push offset sir1+16
push offset sir1+12
push offset sir1+8
push offset sir1+4
push offset sir1
push offset format
call scanf
add ESP, 32

push sir1+24
push sir1+20
push sir1+16
push sir1+12
push sir1+8
push sir1+4
push sir1
push offset rezultat
call printf
add ESP, 32

;apel functie exit
push 0
call exit
end star

t

我看到了两个问题:1您只分配了一个字节的空间来保存scanf的结果,2您只在堆栈上加了8个字节,然后向堆栈中添加了16个字节

这项工作:

jcomeau@aspire:/tmp$ as -o test.o test.asm
jcomeau@aspire:/tmp$ ld -o test -dynamic-linker /lib/ld-linux.so.2 /usr/lib32/crt1.o /usr/lib32/crti.o -lc test.o /usr/lib32/crtn.o
jcomeau@aspire:/tmp$ echo 23 + 24 | ./test
introduceti sirul: rezultat= 23 + 24
以GNU为格式的代码:

.intel_syntax noprefix
.extern printf, scanf, exit
.data
numbers: .long 0, 0
sir1: .byte 0, 0
rezultat: .asciz "rezultat= %d %c %d\n"
format: .asciz "%d %c %d"
msg1: .asciz "introduceti sirul: "
.globl _start
.globl main
main:
push offset msg1
call printf
add ESP, 4

push offset numbers+4
push offset sir1
push offset numbers
push offset format
call scanf
add ESP, 16

push numbers+4
push sir1
push numbers
push offset rezultat
call printf
add ESP, 16

push 0
call exit

如果您打算继续从汇编语言调用库例程,最好花时间学习Agner Fog的资源,特别是2,在汇编语言中优化子例程,关于调用约定的部分

是的,代码是必需的;请发布它。scanf几乎是一个小型翻译。最简单的方法是简单地将一些C实现编译成汇编程序,最好是一个更小的嵌入式版本。我真的不知道怎么做,而且我也不是一个C专家,所以我宁愿坚持汇编。这段代码会崩溃吗?如果是这样的话,它会给你一个错误消息吗?我用记事本++编译它,它只是崩溃了,没有任何消息