ASCII和64位寄存器汇编
问题描述:
当我给出1作为从键盘输入此代码的输入时,rbx更改为a31h。但是数字'1'的ASCII值是30h。那么为什么rbx成为30小时?ASCII和64位寄存器汇编
section .text
global _start
_start:
mov rax,1
mov rdi,1
mov rsi,msg
mov rdx,len
syscall
mov rax,0
mov rdi,0
mov rsi,num
mov rdx,1024
syscall
mov rbx,[num]
mov rax,60
mov rdi,0
syscall
section .data
msg: db 0Ah,"Enter here:",0
len: equ $ - msg
section .bss
num: resb 10
答
因为您所指定的1024,这意味着read
系统调用越来越字节长度,表示字符'1'
,以及代表换行符0ah
的31h
。
如果你只想要一个字符,只要求一个字符,而不是1024
而且,如果你试图让全宽为rbx
,确保您清除了高位之后,是这样的:
mov rbx, [num]
and rbx, 0ffh
虽然更好的解决方案可能只是与零扩展加载一个字节:
movzx rbx, byte [num]
既然你提供的代码示例,您可能要到m也可以使用'movzx',这样人们就不会误认为'和'方法是最好的。 – Jester
@Jester,谢谢,这只是OP的一个警告,我没有想太多。但是,根据你的建议,我已经添加了它。 – paxdiablo
有想法。谢谢你们的帮助。 – Rashintha