gpt4 book ai didi

linux - 将地址处的值加载到寄存器中

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:07 25 4
gpt4 key购买 nike

作为学习练习,我一直在手写汇编。我似乎无法弄清楚如何将地址的值加载到寄存器中。

在语义上,我想做以下事情:

_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 指令,您需要的是:

movzbl  (%ecx), %edi        

也就是说,零扩展edi 中,将字节注册到 ecx 中包含的内存地址。

_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

movzbl (%ecx), %edi # Pull the value at address ecx into edi
cmp $97, %edi # Compare to 'a'
je done

一些建议

  • 您实际上并不需要movz 指令:您不需要单独的加载操作,因为您可以比较ecx 指向的内存中的字节> 直接使用 cmp:

    cmpb $97, (%ecx)
  • 您可能希望将要比较的字符(即 'a')指定为 $'a' 而不是 $97 为了提高可读性:

    cmpb $'a', (%ecx)
  • Avoiding conditional branches is usually a good idea .在执行系统调用后,您可以立即使用以下代码使用 cmov 来确定存储在 eax 中的返回值,而不是执行条件跳转(即, je 指令):

    xor     %eax, %eax     # set eax to zero
    cmpb $'a', (%ecx) # compare to 'a'
    cmovz %edx, %eax # conditionally move edx(=1) into eax
    ret # eax is either 0 or 1 at this point

    edx 在系统调用之前被设置为 1。因此,上述方法依赖于 edx 在整个系统调用(即 int 0x80 指令)中保留这一事实。

  • 更好的是,您可以在比较后对 al 使用 sete 而不是 cmov:

    xor     %eax, %eax     # set eax to zero
    cmpb $'a', (%ecx) # compare to 'a'
    sete %al # conditionally set al
    ret # eax is either 0 or 1 at this point

    通过 xor %eax, %eax 设置为零的寄存器 al 将被设置为 1 如果ZF 标志由 cmp 设置(即,如果 ecx 指向的字节是 'a')。使用这种方法,您无需考虑系统调用是否保留 edx,因为结果不依赖于 edx

    <

关于linux - 将地址处的值加载到寄存器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48495912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com