我遇到了计算机系统考试测试集中的一个问题。
问题/任务是:“用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, %rax
和testq %rdx, %rdx
的目的是什么?该代码使用了
%rdi
(arg1)和%rdx
(arg3),但没有使用%rsi
(arg2)-这是在欺骗我们的学生(arg2无用),或者转换为时应如何理解? C?我们从未将任何内容复制到地址
-8(%rdi)
,但是突然我们想将其内容复制到%rdx
吗?我整天都在阅读汇编,但是我很难完全掌握它。如果我在评论中有任何错误,请指出。
谢谢。
最佳答案
test
用于零(NULL
)检查。
自变量寄存器可用作通用。因此,此函数仅接受1个参数。 rdx
只是用作局部变量。
您从来没有将其设置为任何东西,但调用者大概已经设置了。