终端在 x86 减法运算中打印"?"字符



为了一个简单的减法问题而组装一些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'等等。

最新更新