比较语句不适用于汇编语言 x86 nasm linux 中的用户输入

发布于 2025-01-16 03:49:38 字数 2366 浏览 2 评论 0原文

我正在尝试用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文