小编Dav*_*vid的帖子

如何实现汇编变量?

我对如何在Assembly中实现变量感到有点困惑.我知道以下声明在程序的data部分中创建了一个命名的内存位置:

.section .data
        var:
                .long 23
Run Code Online (Sandbox Code Playgroud)

然后您可以访问变量,例如:

movl var, %eax //read from var location
Run Code Online (Sandbox Code Playgroud)

我不清楚的是上面的说明是如何实际实现的.我的印象是,在使用之前,需要将内存引用(甚至是绝对内存引用)加载到寄存器中.

汇编程序是否需要将上述指令转换为多个指令,例如:

leal var, %ebx
movl (%ebx), %eax
Run Code Online (Sandbox Code Playgroud)

或者汇编程序是否跟踪var该位置的地址并访问该位置,就好像它是绝对的即时访问一样,例如:

movl ($addr_of_var), %eax
Run Code Online (Sandbox Code Playgroud)

x86 assembly gnu-assembler

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

是否有理由指定8位寄存器的移位?

是否有人应该使用8位寄存器而不是32位寄存器来指定移位?我已经看过几次x86代码,看起来像这样:

movl %ebx, %ecx
sall %cl,  %edx
Run Code Online (Sandbox Code Playgroud)

由于这只使用低8位ecx,我会将其转换为类似(在C代码中):

ebx = ecx;
edx = edx << (ecx % 256);
Run Code Online (Sandbox Code Playgroud)

它似乎更容易说:

movl %ebx, %ecx
sall %ecx, %edx
Run Code Online (Sandbox Code Playgroud)

我见过,即使在像文档的地方使用的8位寄存器,其中的区别cl,并ecx不会使一个代码示例的正确性的差异.例如,在此链接.

x86 assembly

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

标签 统计

assembly ×2

x86 ×2

gnu-assembler ×1