【发布时间】:2018-01-17 18:12:36
【问题描述】:
我在计算机系统考试测试集中遇到了一个问题。
问题/任务是:“用 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?
我整天都在阅读有关汇编的内容,但我很难完全掌握它。如果我在我的 cmets 中犯了任何错误,请指出。
谢谢。
【问题讨论】:
-
您可能还想查看stackoverflow.com/questions/48269670/x86-64-assembly-to-c/…(尽管您对同一来源有不同的问题)
-
还有这个:stackoverflow.com/q/48262294/4271923 这是关于不同的 CPU(不同的指令和寄存器),但我对 CPU 与内存芯片的心智模型的解释,可以以相同的方式与 x86 一起使用。