我在学习汇编,它在某种程度上是有意义的,但我有一个问题。我有这个源文件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位)教程,所以我不幸地不知道哪个存在,哪个好还是不好。这只是一个断言,因为我认为一个好的教程应该在其介绍中有一些历史。 –