任务:用C

时间:2018-01-17 18:12:37

标签: c assembly x86

我的计算机系统考试测试集中的问题出了问题。

问题/任务是:"在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, %raxtestq %rdx, %rdx的目的是什么?
  • 代码使用%rdi(arg1)和%rdx(arg3),但不是%rsi(arg2) - 这是欺骗我们的学生(不使用arg2),或者如何在转换为C时进行编程?
  • 我们从未将任何内容复制到地址-8(%rdi),但我们突然希望将其内容复制到%rdx

我整天都在阅读大会,但我很难完全掌握它。如果我在评论中犯了任何错误,请指出它们。

谢谢。

2 个答案:

答案 0 :(得分:0)

  1. parse用于零(test)检查。
  2. 参数寄存器可用作通用目的。因此,此函数只需要1个参数。 NULL仅用作本地变量。
  3. 从不将其设置为任何内容,但调用者可能已经将其设置为。

答案 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;

}

我离得很远吗?