【问题标题】:understanding pointers and casting in assembly理解汇编中的指针和铸造
【发布时间】:2016-02-19 15:06:31
【问题描述】:

我在汇编中获得了一个函数,它基本上将大写字母转换为小写字母。这里是一些组装,

 Q1:
    pushq %rbp
    movq %rsp, %rbp 
    subq $24, %rsp
    movq %rdi, -24(%rbp)
    movl $0, -4(%rbp)
    movl $0. -8%(%rbp) 
    jmp .L2
L2:
    movl -4(%rbp) %edx
    movq -24(%rbp), %rax
    addq %rdx, %rax
    movzbl (%rax), %eax
    testb %al, %al
    jne .L4
    ...

其余的大部分内容都是重复的,但 L2 确实让我感到困惑。到目前为止,这是我的逻辑: 我们将 param1 存储到 -24(%rbp) 中。我们创建 local1 和 local2,将它们都设置为 0,然后跳转到 L2。我将 local1 移动到 %edx,将 param1 移动到 %rax。现在这就是让我感到困惑的地方, 我被告知以下行,addq 最终在 local1 中作为指向 param1 的指针。我只是推理添加 local1 + param1 并将它们存储到 %rax 中。这怎么可能?

接下来是movzbl。根据我的理解,我们取消引用 %rax,所以我们得到类似 eax = (int) rax 的东西。

我还被告知将其视为将 char 转换为 int。哪一个是真的,我怎么知道我在打字?如果 %rax 周围没有括号怎么办?它是一个 int 吗,因为它是 4 个字节,而 %eax 是一个 32 位寄存器。提前感谢您的帮助,我有点迷路了......

【问题讨论】:

    标签: c assembly x86-64


    【解决方案1】:

    local1 不是指针,而是索引(计数器)。 该代码正在执行以下操作:

    void toupper(char* text)
    {
        int i = 0;  /* at rbp-4 */
        int j = 0;  /* unused, at rbp-8 */
        int ch;     /* in eax */
        while((ch = *(text + i)) != 0)
        {
            ...
        }
    }
    

    请注意,在 C 指针运算中,*(text + i) 当然等同于text[i]

    是的,movzbl 正在将 unsigned char 转换为 int,您可以从指令名称本身看出:MOVe Zero extended Byte 到 Long。

    括号表示指针解引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多