汇编语言中的错误计算 程序与C++相比,在汇编语言中给出了错误的计算,并且我找不到错误。有什么想法吗 // (2 * c + b + a - 5) / (a / 4 - 1) #include <iostream> using namesp
汇编语言中的错误计算 <>程序与C++相比,在汇编语言中给出了错误的计算,并且我找不到错误。有什么想法吗汇编语言中的错误计算 程序与C++相比,在汇编语言中给出了错误的计算,并且我找不到错误。有什么想法吗 // (2 * c + b + a - 5) / (a / 4 - 1) #include <iostream> using namesp,c++,assembly,x86-64,inline-assembly,C++,Assembly,X86 64,Inline Assembly,汇编语言中的错误计算 程序与C++相比,在汇编语言中给出了错误的计算,并且我找不到错误。有什么想法吗 // (2 * c + b + a - 5) / (a / 4 - 1) #include <iostream> using namespace std; void print_of() { cout << "Overflow error\n"; exit(1); } void print_zf() { cout <
// (2 * c + b + a - 5) / (a / 4 - 1)
#include <iostream>
using namespace std;
void print_of() {
cout << "Overflow error\n";
exit(1);
}
void print_zf() {
cout << "Division by zero error\n";
exit(1);
}
int main() {
long int a, b, c;
long int asm_answer;
cout << "(2 * c + b + a - 5) / (a / 4 - 1)\n";
cout << "Enter a, b, c: ";
cin >> a >> b >> c;
// eax, ebx, ecx - general-purpose registers, its specific abilities don't matter in this laboratory work
__asm {
; a / 4
mov rax, a; rax = a
mov rbx, 4; rbx = 4
cqo; Convert Quad to Octa (rax -> rdx:rax)
idiv rbx; division with a sign (dividend should be in rdx:rax -> quotient in rax, remainder in rdx)
; a / 4 - 1
dec rax; decrement
jo of_error; overflow error
jz zf_error; if rax = 0, there will be division by zefo error
; reset
push rax; push (a / 4 - 1) in stack
; 2 * c
mov rax, c; rax = c
imul rax, 2; rax = rax * 2
jo of_error; overflow error
; 2 * c + b
mov rdx, b; rdx = b
add rax, rdx; rax = rax + rdx
jo of_error; overflow error
; 2 * c + b + a
mov rdx, a; rdx = a
add rax, rdx; rax = rax + rdx
jo of_error; overflow error
; 2 * c + b + a - 5
sub rax, -5; rax = rax - 5
jo of_error; overflow error
; rax = 2 * c + b - 5, rbx = a / 4 - 1
pop rbx; rbx = a / 4 - 1
; (2 * c + b + a - 5) / (a / 4 - 1)
cqo; Convert Quad to Octa (rax -> rdx:rax)
idiv rbx; division with a sign (dividend should be in rdx:rax -> quotient in rax, remainder in rdx)
mov asm_answer, rax
jmp ext; "exit" is reserved
of_error:
call print_of; print overflow error (exit in function!)
zf_error:
call print_zf; print division by zero error (exit in function!)
ext:
}
cout << "asm result: " << asm_answer << "\n";
cout << "C++ result: " << (2 * c + b + a - 5) / (a / 4 - 1) << "\n";
return 0;
}
/(2*c+b+a-5)/(a/4-1)
#包括
使用名称空间std;
无效打印(共页){
cout b>>c;
//eax、ebx、ecx——通用寄存器,其特定功能在本实验室工作中并不重要
__asm{
;a/4
mov-rax,a;rax=a
mov-rbx,4;rbx=4
cqo;将四进制转换为八进制(rax->rdx:rax)
idiv rbx;带符号的除法(股息应为rdx:rax->rax中的商,剩余部分为rdx)
;a/4-1
减量
jo of_错误;溢出错误
jz zf_误差;如果rax=0,则将除以zefo误差
;重置
推送rax;在堆栈中推送(a/4-1)
;2*c
mov-rax,c;rax=c
imul rax,2;rax=rax*2
jo of_错误;溢出错误
;2*c+b
mov-rdx,b;rdx=b
加上rax,rdx;rax=rax+rdx
jo of_错误;溢出错误
;2*c+b+a
mov-rdx,a;rdx=a
加上rax,rdx;rax=rax+rdx
jo of_错误;溢出错误
;2*c+b+a-5
子rax,-5;rax=rax-5
jo of_错误;溢出错误
;rax=2*c+b-5,rbx=a/4-1
pop rbx;rbx=a/4-1
(2*c+b+a-5)/(a/4-1)
cqo;将四进制转换为八进制(rax->rdx:rax)
idiv rbx;带符号的除法(股息应为rdx:rax->rax中的商,剩余部分为rdx)
mov asm_回答,rax
jmp ext;保留“退出”
错误类型:
调用print_of;打印溢出错误(在函数中退出!)
zf_错误:
调用print_zf;打印按零除错误(退出函数!)
提取:
}
cout根据到目前为止的调试情况,在计算过程中的哪一点汇编结果开始与预期结果不一致?将“b”加两次,然后加5(减去负5)@1201programalm,抱歉误传,我把代码复制错了,在源代码中减法-5只出现一次。你知道减法-5是加法5,n-=(-5)是n+=5吗?预期的2*c+b+a-5
实际上是2*c+b+a-(-5)
在您的代码中。@kernel\u任务:然后使用更好的调试器,或将调试器切换到“反汇编”模式,以便您可以单步执行asm指令,无论它们是否来自asm块。弄清楚如何使用调试工具应该始终是第一步,因为在调试asm时,在单步执行时看到寄存器值发生变化是非常有价值的。否则,您将浪费自己(和其他人)的时间。