汇编语言中的错误计算 程序与C++相比,在汇编语言中给出了错误的计算,并且我找不到错误。有什么想法吗 // (2 * c + b + a - 5) / (a / 4 - 1) #include <iostream> using namesp

汇编语言中的错误计算 程序与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 <

汇编语言中的错误计算 <>程序与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 << "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时,在单步执行时看到寄存器值发生变化是非常有价值的。否则,您将浪费自己(和其他人)的时间。