我的计算机系统考试测试集中的问题出了问题。
问题/任务是:"在C" 中重写以下X86-assembler程序。
我已经完成了汇编代码,并评论了我认为我知道的事情:
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
?我整天都在阅读大会,但我很难完全掌握它。如果我在评论中犯了任何错误,请指出它们。
谢谢。
答案 0 :(得分:0)
parse
用于零(test
)检查。NULL
仅用作本地变量。答案 1 :(得分:0)
我已经能够猜测它在C中的表现(感谢Jesters的回答):
void main(rdi)
{
long rax = rdi;
if (rax == 0)
{
return;
}
rdi += 8;
long rdx = rdi;
do
{
if(rdx-rax < 0)
{
rax = rdx;
}
rdi += 8;
rdx = unknown_variable //(-8(%rdi))
} while(rdx != 0 );
return;
}
我离得很远吗?