【问题标题】:MUL and XOR Assembly InstructionsMUL 和 XOR 组装说明
【发布时间】:2015-06-25 22:51:43
【问题描述】:

inb4:是的,我已经看到过类似的问题,之前发布的任务相同,但是我的略有不同。 好的,这是编码任务,创建一个基本的计算器。我已经完成了大部分功能,除了两个:MUL 和 XOR。 MUL 已实现,但是要获得完整的功劳,我们需要在不使用实际 MUL 操作的情况下实现它。环形? 对于 XOR 函数,我只是稍微偏离了输出。寄存器没有清零? 这是我在英特尔汇编中的第二周编程,所以在这一点上我几乎一无所知。不知道如何实现循环,所以一些可靠的帮助会很棒。 谢谢 这是一个 C 函数中的汇编代码,它接受一个运算符和两个整数。

__asm
{
    mov eax, 0; zero out the result
        mov ebx, opcode; move opcode to ebx for comparison

    cmp ebx, 0x01; check for ADD
    jne sub_2;
    mov eax, op1;
    add eax, op2;
    jmp done;

sub_2:
    cmp ebx, 0x02;
    jne mul_3;
    mov eax, op1;
    sub eax, op2;
    jmp done;

mul_3:
    cmp ebx, 0x03;
    jne div_4;
    mov eax, op1;
    mul op2;        //NOT supposed to use MUL
    jmp done;

div_4:
    cmp ebx, 0x04;
    jne mod_5;
    mov eax, op1;
    cdq;     //32bit number turns into 64bit for eax
    idiv op2;
    jmp done;

mod_5:
    cmp ebx, 0x05; 
    jne and_6;
    xor edx, edx; //Clear edx;
    mov eax, op1;
    cdq;    //32bit to 64 for eax;
    idiv op2;
    mov eax, edx;
    jmp done;

and_6:
    cmp ebx, 0x06;
    jne or_7;
    xor edx, edx; //Clear edx
    mov eax, op1;
    and eax, op2;
    jmp done;

or_7:
    cmp ebx, 0x07;
    jne xor_8;
    xor edx, edx; //Clear edx
    mov eax, op1;
    xor eax, op2;
    jmp done;

xor_8:
    cmp ebx, 0x08;
    jne fac_9;
    xor edx, edx; //Clear edx
    mov edx, op1;
    xor eax, op2;
    jmp done;

fac_9:
    cmp ebx, 0x09;
    jne done;
    xor edx, edx; zero out the register
    mov eax, op1;
    cmp eax, 0;
    mov ecx, op1;
    DEC ecx;
    mov ebx, 1;
    L1:
    mul ebx;
    INC ebx;
    LOOP L1;
    jmp done;

done:
}

【问题讨论】:

  • 我投票结束这个问题,因为它似乎是对另一个用户的回复。
  • 我不确定您希望我们具体提供哪些帮助。你的问题具体是什么?你试过什么了?到目前为止,您进行了哪些调试?另外,这有C++标签有什么原因吗?
  • 问题是:实现MUL而不使用Mul操作符。并且 XOR 函数实现是否正确。
  • 自己尝试一下,在不使用乘法的情况下计算出 3 x 3 是什么。我打赌你可以。
  • 直到现在我还没有在汇编中编程过。我什至不知道是否存在 for 循环。当然,将 op1 乘以 op2 次。我只是不知道语法。

标签: assembly


【解决方案1】:

MUL

mul_3:
    cmp ebx, 0x03;
    jne div_4;
    mov edx, op1;
    mov eax, 0;
    mov ecx, op2;
    test ecx, ecx;
    jz done;
    jns mul_add;
    neg ecx;
    neg edx;
mul_add:
    add eax, edx;
    loop mul_add;
    jmp done;

异或

xor_8:
    cmp ebx, 0x08;
    jne fac_9;
    xor edx, edx; //Clear edx
    mov edx, op1;
    mov eax, op2;
    xor eax, edx;
    jmp done;

附注自从我真正编写 asm 代码以来已经有几十年了,所以这可能不是最好的解决方案,但是您要求一些简单的东西

编辑:修复了 MUL 以使用有符号整数

【讨论】:

  • 那么什么是mul_add?什么时候使用。对我不起作用:(
  • 等等,mul 需要处理有符号和无符号整数。应该这么说
  • 那么你需要“有条件地”否定 edx 和 abs ecx(现在无法编辑答案,抱歉)
  • 好吧,最后一件事。这会从哪里来?就在测试 ecx 之前?
猜你喜欢
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2011-07-01
相关资源
最近更新 更多