2014-04-25 201 views
0

當我給出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 

回答

4

因爲您所指定的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