我对如何在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) 是否有人应该使用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不会使一个代码示例的正确性的差异.例如,在此链接.