为了一个简单的减法问题而组装一些x86程序集,我遇到了一个问题。以下是我迄今为止尝试过的代码:
section .text
global _start
_start:
MOV EAX, 4 ; sys_write call
MOV EBX, 1 ; file descriptor
MOV ECX, dispMsg
MOV EDX, dispMsgLen
INT 0x80 ; execute instruction set
MOV EAX, 3 ; sys_read call
MOV EBX, 2
MOV [tempf], ECX ; move user-input to tempf
MOV EDX, 3
INT 0x80
MOV EAX, [tempf] ; move tempf to EAX
SUB EAX, '0' ; convert EAX to decimal
MOV EBX, 32 ; move value 32 to EBX
SUB EBX, '0' ; convert EBX to decimal
SUB EAX, EBX ; sub EAX to EBX
ADD EAX, '0' ; convert EAX to ascii
MOV [res], EAX ; move EAX to res
MOV EAX, 4
MOV EBX, 1
MOV ECX, [res]
MOV EDX, 3
INT 0x80
MOV EAX, 1 ; sys_exit call
MOV EBX, 1
INT 0x80
section .bss
tempf resb 3
res resb 3
section .data
dispMsg db 'Input a value', 0xa
dispMsgLen equ $-dispMsg
编译和运行后,系统会提示用户输入一个数字。当他们点击回车键时,我希望代码将用户的输入减去32,并将结果打印到控制台。然而,我只得到了一个"当用户输入数字并按下回车键时,控制台中菱形中的字符。我读到这可能是因为[res]变量中没有要打印的内容,但我确信我已经将user input - 32
之间的差异存储在了res变量中。
感谢大家的帮助。
因此,您的read
系统调用及其后果没有多大意义。
MOV EAX, 3 ; sys_read call
MOV EBX, 2
为什么要从文件描述符2中读取?这是一个标准错误,不一定要公开阅读。如果您想从用户那里获得输入,请从标准输入读取文件描述符0。
MOV [tempf], ECX ; move user-input to tempf
这不是它的作用;它取CCD_ 3中的(垃圾(值(顺便说一下是四个字节(并将其存储在地址CCD_。我想你是想写MOV ECX, tempf
的。注意没有括号,因为我们希望tempf
的地址在ECX中,而不是位于内存中该地址的值。
MOV EDX, 3
好的,那么你要读三个字节。我不太确定为什么是三个,但是。。。
INT 0x80
MOV EAX, [tempf] ; move tempf to EAX
这将加载四个字节,因为EAX
是一个32位寄存器。
如果你只想从用户那里得到一个数字(这是你的代码似乎能够处理的全部内容(,那么你可能应该:
只读取一个字节的
将一个字节加载到8位寄存器中,例如
MOV AL, [tempf]
从那时起对该8位寄存器进行操作,例如
SUB AL, '0'
等等。