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',以及代表换行符0ah31h

如果你只想要一个字符,只要求一个字符,而不是1024

而且,如果你试图让全宽为rbx,确保您清除了高位之后,是这样的:

mov rbx, [num] 
and rbx, 0ffh 

虽然更好的解决方案可能只是与零扩展加载一个字节:

movzx rbx, byte [num] 
+1

既然你提供的代码示例,您可能要到m也可以使用'movzx',这样人们就不会误认为'和'方法是最好的。 – Jester

+1

@Jester,谢谢,这只是OP的一个警告,我没有想太多。但是,根据你的建议,我已经添加了它。 – paxdiablo

+0

有想法。谢谢你们的帮助。 – Rashintha