c++ - 汇编语言计算错误
问题描述
与 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;
}
控制台输出示例:
输入 a、b、c:100 0 20 asm 结果:6 C++ 结果:5 程序以退出代码结束:0
另一个例子:
输入 a、b、c:0 0 0 asm 结果:-5 C++ 结果:5 程序以退出代码结束:0
解决方案
推荐阅读
- python - 如何使python在写入txt时转到下一行
- r - 字符串列到 R 中的 Dtm(日期时间)列
- javascript - JS 代码效果不反映在投资组合上
- c++ - 将这个指针添加到静态列表的类模板的全局调用构造函数导致错误
- python - Selenium 代码无法抓取 ofashion.com.cn
- javascript - JavaScript 值发生变化,但画布不会用更新的值重绘
- reactjs - 如何使用 mapState 命名父道具
- spring-webflux - 元素之间相互依赖的反应式 Mono::zip
- flutter - 使用不包含 TrackingBloc 类型的 Bloc 的上下文调用 BlocProvider.of()
- typescript - 如何从打字稿中的嵌套对象的属性中获取类型