【发布时间】:2018-01-29 06:56:42
【问题描述】:
作为学习练习,我一直在进行手写汇编。我似乎无法弄清楚如何将地址的值加载到寄存器中。
在语义上,我想做以下事情:
_start:
# read(0, buffer, 1)
mov $3, %eax # System call 3 is read
mov $0, %ebx # File handle 0 is stdin
mov $buffer, %ecx # Buffer to write to
mov $1, %edx # Length of buffer
int $0x80 # Invoke system call
lea (%ecx, %ecx), %edi # Pull the value at address into %edi
cmp $97, %edi # Compare to 'a'
je done
我已经用 C 编写了一个更高级别的实现:
char buffer[1];
int main()
{
read(0, buffer, 1);
char a = buffer[0];
return (a == 'a') ? 1 : 0;
}
但是使用gcc -S 编译产生的程序集不能很好地移植到我上面的实现中。
我认为lea 是我应该用来将存储在%ecx 中的给定地址处的值加载到%edi 中的正确指令,但是在gdb 中检查时,%edi 在之后包含一个垃圾值该指令被执行。这种方法正确吗?
【问题讨论】:
-
不,
lea会给你有效的地址,即ecx + edi。看起来您想要mov,并且可能只读取一个字节并将其零扩展为双字的变体,因为您正在处理 ASCII 字符。