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:
}
答案 0 :(得分:2)
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
xor_8:
cmp ebx, 0x08;
jne fac_9;
xor edx, edx; //Clear edx
mov edx, op1;
mov eax, op2;
xor eax, edx;
jmp done;
P.S。自从我真正编写asm以来已经过了几十年了,所以这可能不是最好的解决方案,但是你要求的是简单的
编辑:修复MUL以使用有符号整数