我在學習彙編,它在某種程度上是有意義的,但我有一個問題。我有這個源文件hello.sfml
:如何知道使用哪個整數寄存器
; nasm -felf64 hello.asml && ld hello.o
global _start
section .text
_start:
; write(1, message, 13)
mov rax, 1 ; syscall 1 is write
mov rdi, 1 ; file handle 1 is stdout
mov rsi, message ; address of string to output
mov rdx, 13 ; number of bytes in the string
syscall ; invoke OS to write the string
; exit(0)
mov rax, 60 ; syscall 60 is exit
xor rdi, rdi
syscall ; invoke OS to exit
message:
db "Hello, World", 10 ; the 10 is a newline character at the end
這是完美的。我只是不明白爲什麼特定的整數寄存器需要在不同的情況下使用。因此,例如,通過試驗和錯誤,我發現當我說出我想要的系統調用時,例如,
mov rax, 1
...
syscall
我把值1
到整數寄存器rax
,但我還可以使用整數寄存器eax
,ax
,al
,或ah
。
我還沒有學會很長的組裝,所以它可能是一個明顯的問題。
如果我的問題不明顯:我想知道如何決定將值移動到哪個整數寄存器。如果有這樣的通用系統,或者如果每個不同的意圖使用不同的整數寄存器。
我在64位Ubuntu上使用NASM。
編輯:我的問題是不是this one,重複的,因爲在那裏,一個人的詢問,你會用小整數寄存器,我所要求的決定的方法,其整數註冊使用。
寄存器'al','ah'和'ax'來自舊的8位和16位x86架構。 'al'是'ax'的低8位,'ah'是高8位。當i386被引入32位時,'ax'成爲* extended *累加器寄存器'eax'的低16位。然後再將它以64位變量擴展爲'rax'。一個好的英特爾x86程序集歷史搜索應該爲你挖掘出來。或者甚至大多數優秀的教程應該包括我想的。 –
「最好的教程」 - 你能鏈接一個嗎?我使用的教程似乎不是那麼好 –
說實話,我實際上並沒有在很長一段時間看過任何x86(16,32或64位)教程,所以我不幸地不知道哪個存在,哪個好還是不好。這只是一個斷言,因爲我認爲一個好的教程應該在其介紹中有一些歷史。 –