相关疑难解决方法(0)

如何使用push和pop交换2个寄存器的内容?

如果我们考虑两个寄存器 ax 和 bx,我们如何仅通过使用 push 和 pop 来交换它们在 Intel IA-32 中的内容?我不被允许使用 xchg。

这不是家庭作业的问题,我是为了考试而复习。

x86 stack

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

如何从汇编中的地址加载单个字节

如何从地址加载单个字节?我以为会是这样的:

mov      rax, byte[rdi]
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

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

如果我们只对 64 位寄存器的低 4 字节进行 mov 操作,那么它的高 4 字节是否设置为零

我正在从《计算机系统:程序员的视角》学习 x86-64 汇编,并且遇到了一个练习,要求将一行 C 代码转换为(两个)等效的汇编指令。该代码是关于使用指针将一种类型的变量复制到另一种类型的变量。

指针变量声明如下:

src_t *sp; //src_t and dest_t are typedefs
dest_t *dp;
Run Code Online (Sandbox Code Playgroud)

需要翻译的C代码是:

*dp = (dest_t)*sp;
Run Code Online (Sandbox Code Playgroud)

假设指针sp和分别dp存储在寄存器%rdi%rsi中,并且我们应该设置%rax(例如 、%eax%ax)的“适当部分”%al来进行中间数据复制(因为 x86-64 不允许源和目标同时复制)是内存引用)。

现在,当src_tisunsigned chardest_tis 时long,我为其编写了以下汇编代码:

movzbq (%rdi), %rax //move a byte into %rax with zero extension
movq %rax, (%rsi) //move 8 bytes of 'long' data 
Run Code Online (Sandbox Code Playgroud)

但这本书以及Godboltgcc (与 一起使用-O3)都说它应该是

movzbl  (%rdi), %eax …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64

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

x86 LEA 指令做不明确的事情

这是 C 代码:

int baz(int a, int b)
{
    return a * 11;
}
Run Code Online (Sandbox Code Playgroud)

它被编译为以下一组汇编指令(带有 -O2 标志):

baz(int, int):
        lea     eax, [rdi+rdi*4]
        lea     eax, [rdi+rax*2]
        ret
Run Code Online (Sandbox Code Playgroud)

lea指令计算第二个操作数(源操作数)的有效地址并将其存储在第一个操作数中。对我来说,第一条指令似乎应该将地址加载到 EAX 寄存器,但是,如果是这样,在第二条指令中将 RAX 乘以 2 没有意义lea,所以我推断这两lea条指令不会做完全相同的事情。

我想知道是否有人可以澄清这里到底发生了什么。

c assembly x86-64 instruction-set

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

程序集自动跳转到下一个标签

我在汇编中编写了一个程序,如下所示:

%macro print 1

    push rbp

    mov rdi, %1
    xor rax, rax

    call _printf

    pop rbp

%endmacro    
section .data
    e db 'Equal', 0
    l db 'Less than', 0
    g db 'Greater than', 0
section .text
        global start
        extern _printf
    start:
        mov rax, 5
        mov rbx, 5
        cmp rax, rbx ; Compare 4 and 5
        je _equal ; je = jump if equal
        cmp rax, rbx
        jl _less ; jl = jump if less
        cmp rax, rbx
        jg _greater ; jg …
Run Code Online (Sandbox Code Playgroud)

x86 assembly x86-64

0
推荐指数
1
解决办法
1288
查看次数

标签 统计

assembly ×4

x86 ×3

x86-64 ×3

c ×2

gcc ×1

instruction-set ×1

nasm ×1

stack ×1