我遇到了计算机系统考试测试集中的一个问题。

问题/任务是:“用C重写以下X86汇编程序”。

我遍历了汇编代码,并评论了我想知道的内容:

program:
    movq (%rdi), %rax   # 1st argument copied to return value register
    testq %rax, %rax    # Sets ZF to 1 if value stored in it is 0 (return value == 0)?
    je L1               # Jump to L1 if (ZF == 1)
    addq $8, %rdi        # Value 8 is added to 1st argument
    movq %rax, %rdx     # Retun value register is copied to 3rd argument
L3:
    cmpq %rdx, %rax     # sets SF if (return value - 3rd argument < 0)?
    cmovl %rdx, %rax    # Copy 3rd argument to return value register if (SF = 1)?
    addq $8, %rdi        # Value 8 is added to 1st argument
    movq -8(%rdi), %rdx # ?
    testq %rdx, %rdx    # Sets ZF to 1 if value stored in it is 0 (3rd argument == 0)?
    jne L3              # Jump to L3 if (ZF == 0)?
L1:
    ret                 # Pop's return address off the stack, and sets intruction pointer to it


我不确定一些安静的事情,如果有人可以为我澄清的话,那就太糟糕了:


testq %rax, %raxtestq %rdx, %rdx的目的是什么?
该代码使用了%rdi(arg1)和%rdx(arg3),但没有使用%rsi(arg2)-这是在欺骗我们的学生(arg2无用),或者转换为时应如何理解? C?
我们从未将任何内容复制到地址-8(%rdi),但是突然我们想将其内容复制到%rdx吗?


我整天都在阅读汇编,但是我很难完全掌握它。如果我在评论中有任何错误,请指出。

谢谢。

最佳答案

test用于零(NULL)检查。
自变量寄存器可用作通用。因此,此函数仅接受1个参数。 rdx只是用作局部变量。
您从来没有将其设置为任何东西,但调用者大概已经设置了。

09-29 21:29