以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?
xorl %eax, %eax
mov $0, %eax
andl $0, %eax
Run Code Online (Sandbox Code Playgroud) 要清除所有位,您经常会看到一个独占或在XOR eax, eax.反过来也有这样的伎俩吗?
我能想到的是用额外的指令反转零.
我正在编写有关汇编中基本输入和输出的教程。我使用的是 64 位的 Linux 发行版 (Ubuntu)。在教程的第一部分,我谈到了基本输出并创建了一个简单的程序,如下所示:
global _start
section .text
_start:
mov rax,1
mov rdi,1
mov rsi,message
mov rdx,13
syscall
mov rax,60
xor rdi,rdi
syscall
section .data
message: db "Hello, World", 10
Run Code Online (Sandbox Code Playgroud)
这很好用。系统打印字符串并干净地退出。对于教程的下一部分,我只想从键盘读取一个字符。根据我对这个网站的理解,我们将rdi寄存器更改为0以进行 sys_read 调用。
我首先从当前rsp 中减去 8 ,然后将该地址加载到rsi寄存器中。(那是我想存储字符的地方)。当我编译并运行我的程序时,它似乎可以工作……但终端似乎模仿了我再次输入的输入。
这是程序:
global _start
section .text
_start:
sub rsp,8 ; allocate space on the stack to read
mov rdi,0 ; set rdi to 0 to indicate a system read
mov rsi,[rsp-8]
mov …Run Code Online (Sandbox Code Playgroud) assembly ×3
x86-64 ×2
arm ×1
io ×1
linux ×1
mips ×1
nasm ×1
optimization ×1
performance ×1
x86 ×1