比较语句不适用于汇编语言 x86 nasm linux 中的用户输入
我正在尝试用 x86 汇编语言创建计算器,我正在接受输入来检查用户想要哪个操作,但 cmp 语句不起作用。获取输入后程序直接跳转到add_nums。我想问的第二件事是,深入学习汇编语言在当今时代有多大用处?
STDOUT equ 1;
STDIN equ 0;
SYS_EXIT equ 1;
SYS_WRITE equ 4;
SYS_READ equ 3;
section .bss
choice resd 1;
opOne resb 4;
opTwo resb 4;
result resb 4;
section .data
msgBanner db "Enter 1 for addtion : ", 0xA, 0xD;
lenBanner equ $ - msgBanner;
msgInpOne db "Enter First Operand : ", 0xA, 0xD;
lenOne equ $ - msgInpOne;
msgInpTwo db "Enter Second Operand : ", 0xA, 0xD;
lenTwo equ $- msgInpTwo;
endMsg db "Sum is : ";
lenEndMsg equ $ - endMsg;
test1 dd 1;
test2 dd 2;
section .text
global _start;
_start:
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, msgBanner;
mov edx, lenBanner;
int 0x80;
mov eax, SYS_READ;
mov ebx, STDIN;
mov ecx, choice;
mov edx, 4;
int 0x80;
mov ecx, [test1];
cmp ecx, [choice];
je sub_nums;
mov ecx, [test2];
cmp ecx, [choice];
je add_nums;
add_nums:
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, msgInpOne;
mov edx, lenOne;
int 0x80;
mov eax, SYS_READ;
mov ebx, STDIN;
mov ecx, opOne;
mov edx, 4;
int 0x80;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, msgInpTwo;
mov edx, lenTwo;
int 0x80;
mov eax, SYS_READ;
mov ebx, STDIN;
mov ecx, opTwo;
mov edx, 4;
int 0x80;
mov eax, [opOne];
mov ebx, [opTwo];
sub eax, '0';
sub ebx, '0';
add eax, ebx;
add eax, '0';
mov [result], eax;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, endMsg;
mov edx, lenEndMsg;
int 0x80;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, result;
mov edx, 4;
int 0x80;
mov eax, SYS_EXIT;
int 0x80;
sub_nums:
mov [result], eax;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, endMsg;
mov edx, lenEndMsg;
int 0x80;
mov eax, SYS_EXIT;
int 0x80;
I am trying to create calculator in x86 assembly language, I am taking input to check which operation user wants, but cmp statement is not working. After taking input program directly jumps on add_nums. The second thing I want to ask is that how useful it will be to learn assembly language in-depth in today's era
STDOUT equ 1;
STDIN equ 0;
SYS_EXIT equ 1;
SYS_WRITE equ 4;
SYS_READ equ 3;
section .bss
choice resd 1;
opOne resb 4;
opTwo resb 4;
result resb 4;
section .data
msgBanner db "Enter 1 for addtion : ", 0xA, 0xD;
lenBanner equ $ - msgBanner;
msgInpOne db "Enter First Operand : ", 0xA, 0xD;
lenOne equ $ - msgInpOne;
msgInpTwo db "Enter Second Operand : ", 0xA, 0xD;
lenTwo equ $- msgInpTwo;
endMsg db "Sum is : ";
lenEndMsg equ $ - endMsg;
test1 dd 1;
test2 dd 2;
section .text
global _start;
_start:
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, msgBanner;
mov edx, lenBanner;
int 0x80;
mov eax, SYS_READ;
mov ebx, STDIN;
mov ecx, choice;
mov edx, 4;
int 0x80;
mov ecx, [test1];
cmp ecx, [choice];
je sub_nums;
mov ecx, [test2];
cmp ecx, [choice];
je add_nums;
add_nums:
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, msgInpOne;
mov edx, lenOne;
int 0x80;
mov eax, SYS_READ;
mov ebx, STDIN;
mov ecx, opOne;
mov edx, 4;
int 0x80;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, msgInpTwo;
mov edx, lenTwo;
int 0x80;
mov eax, SYS_READ;
mov ebx, STDIN;
mov ecx, opTwo;
mov edx, 4;
int 0x80;
mov eax, [opOne];
mov ebx, [opTwo];
sub eax, '0';
sub ebx, '0';
add eax, ebx;
add eax, '0';
mov [result], eax;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, endMsg;
mov edx, lenEndMsg;
int 0x80;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, result;
mov edx, 4;
int 0x80;
mov eax, SYS_EXIT;
int 0x80;
sub_nums:
mov [result], eax;
mov eax, SYS_WRITE;
mov ebx, STDOUT;
mov ecx, endMsg;
mov edx, lenEndMsg;
int 0x80;
mov eax, SYS_EXIT;
int 0x80;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论