相关疑难解决方法(0)

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或?

以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 assembly micro-optimization

109
推荐指数
1
解决办法
4万
查看次数

将CPU寄存器中的所有位有效地设置为1

要清除所有位,您经常会看到一个独占或在XOR eax, eax.反过来也有这样的伎俩吗?

我能想到的是用额外的指令反转零.

assembly arm x86-64 mips

17
推荐指数
1
解决办法
2154
查看次数

使用 x64 汇编代码的基本输入

我正在编写有关汇编中基本输入和输出的教程。我使用的是 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)

linux io assembly x86-64 nasm

2
推荐指数
2
解决办法
3318
查看次数

标签 统计

assembly ×3

x86-64 ×2

arm ×1

io ×1

linux ×1

micro-optimization ×1

mips ×1

nasm ×1

optimization ×1

performance ×1

x86 ×1