RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1274329
Accepted
Lagunov
Lagunov
Asked:2022-04-24 23:28:21 +0000 UTC2022-04-24 23:28:21 +0000 UTC 2022-04-24 23:28:21 +0000 UTC

部门不工作

  • 772
format pe console
include 'C:\Program Files\FASM\INCLUDE\win32ax.inc'
include 'C:\Program Files\FASM\INCLUDE\api\kernel32.inc'
entry start


.data
Num1 dd 0 ;Первое
Num2 dd 0 ;Второе число
Act db 0 ;Операция


.code
start:  cinvoke printf, <'It is console calculator%c+ addition%c- subtraction%c* multiplication%c/ devision%c%c'>, 10, 10, 10, 10, 10, 10
        begin:
        cinvoke printf, <'First number: '> ;Ввод пользователем чисел и операции
        cinvoke scanf, <'%d'>, Num1
        cinvoke printf, <'Second number: '>
        cinvoke scanf, <'%d'>, Num2
        cinvoke printf, <'Operation: '>
        cinvoke scanf, <'%s'>, Act

        cmp byte [Act], '+' ;Проверка на сложение
        jne notAdd ;Если не сложение, то перейти в notAdd
            mov eax, dword [Num1] ;Сложение
            add eax, dword [Num2]
            cinvoke printf, <'Result: %d'>, eax ;Вывод результата
            cinvoke getch
            cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
            jmp begin ;Переход в начало

notAdd:  cmp byte [Act], '-' ;Проверка на вычитание
         jne notSub ;Если не вычитание, то перейти в notSub
            mov eax, dword [Num1] ;Вычитание
            sub eax, dword [Num2]
            cinvoke printf, <'Result: %d'>, eax ;Вывод результата
            cinvoke getch
            cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
            jmp begin ;Переход в начало

notSub:  cmp byte [Act], '*' ;Проверка на умножение
         jne notMul ;Если не умножение, то перейти в notMul
            mov eax, dword [Num1] ;Умножение
            imul dword [Num2]
            cinvoke printf, <'Result: %d'>, eax ;Вывод результата
            cinvoke getch
            cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
            jmp begin ;Переход в начало

notMul:  cmp byte [Act], '/' ;Проверка на деление
         jne notDiv ;Если не деление, то перейти в notDiv
             cmp dword [Num2], 0 ;Проверка на деление на ноль
             je divisionByZero ;Если деление на ноль, то перейти в divisionByZero
                 mov eax, dword [Num1] ;Деление
                 idiv dword [Num2]
                 cinvoke printf, <'Result: %d'>, eax ;Вывод результата
                 cinvoke getch
                 cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
                 jmp begin ;Переход в начало

notDiv:  cinvoke printf, <'Invailid operation'>
         cinvoke getch
         cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
         jmp begin ;Переход в начало

divisionByZero:  cinvoke printf, <'Infinity'>
                 cinvoke getch
                 cinvoke printf, <'%c%c'>, 10, 10 ;Пропуск 2 строк
                 jmp begin ;Переход в начало

section '.idata' import data readable
library kernel32,'kernel32.dll',msvcrt,'msvcrt.dll'
import msvcrt, printf, 'printf', getch, '_getch', scanf, 'scanf'

我写了一个计算器,其中输入了 2 个数字和一个动作。首先,它检查是否需要添加数字。如果动作不是加法,则检查是否需要减去数字。然后是乘法和除法。如果不是除法,则显示动作不正确的信息。我有两个问题:

1 如果你乘以大数,那么答案是错误的。结果分为两半,一个写入edx,另一个写入eax。我不知道如何连接它们。

2 如果除以 0 以外的任何数字,则应用程序崩溃。

ассемблер
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Илья К
    2022-04-24T23:51:48Z2022-04-24T23:51:48Z
    1. 它们无法连接,这已经是很长的数学运算了,您要么需要自己将它们转换为传递给输出的字符串,要么给出输入数据超出范围的答案。
    • 0
  2. Best Answer
    PRODIGY
    2022-04-25T01:44:47Z2022-04-25T01:44:47Z
    1. 对于大数(实际上对于任何计算器),通常使用 FPU 协处理器。
    2. 在除法运算中,红利不是在 中EAX,而是在一对EDX:EAX中。因此,您需要制定一条规则,在指令之前DIV始终清除EDX= xor edx,edx。在输出处,我们在寄存器EAX中得到一个整数,以及EDX除法的余数。乘法运算时,结果也是在pairEDX:EAX中,而这pair 只能以HEX 的形式输出,也可以由同一个FPU 输出。这是一个例子:
        format pe console
        include 'win32ax.inc'
        entry start
        ;//----------
        .data
        Num1     dd   0
        Num2     dd   0
        Result   dq   0    ;// 8-байт результ для FPU
        ;//----------
        .code
        start:  cinvoke  printf,<10,10,' First number.: '>
                cinvoke  scanf, <'%d'>, Num1
                cinvoke  printf,<' Second number: '>
                cinvoke  scanf, <'%d'>, Num2
                cinvoke  printf,<' Operation....: '>
                cinvoke  getch          ;//<---- символ в EAX (AL)
    
                 finit                  ;// очистить регистры сопра
                 fild    [Num1]         ;// загрузить число в регистр ST0
    
                 cmp     al,'+'
                 jne     @f
                cinvoke  printf,<'+'>
                 fiadd   [Num2]         ;// прибавить к ST0 переменную
                 jmp     @getResult
        @@:      cmp     al,'-'
                 jne     @f
                cinvoke  printf,<'-'>
                 fisub   [Num2]       ;//<--- операция
                 jmp     @getResult
        @@:      cmp     al,'*'
                 jne     @f
                cinvoke  printf,<'*'>
                 fimul   [Num2]       ;//<--- операция
                 jmp     @getResult
        @@:      cmp     al,'/'
                 jne     @f
                cinvoke  printf,<'/'>
                 cmp     [Num2],0
                 je      @f
                 fidiv   [Num2]        ;//<--- операция
                 jmp     @getResult
        @@:     cinvoke  printf,<10,' Error!!!',0>
                 jmp     start
        
        ;//<--- Вывод результата [%.3f] = три знака после запятой
        @getResult:
                 fstp    [Result]       ;// сохранить число FPU в переменной
                cinvoke  printf,<10,' Result.......: %.3f',0>,dword[Result],dword[Result+4]
                 jmp     start
        
        @exit:  cinvoke  getch
                cinvoke  exit,0
        ;//------------
        section '.idata' import data readable
        library  msvcrt,'msvcrt.dll'
        import   msvcrt,printf,'printf',getch,'_getch',scanf,'scanf',exit,'exit'
    
    • 0

相关问题

  • 难以在大会中创建 (for) 语句

  • call 如何使用堆栈?

  • STM32 中的中断/异常向量,汇编器

  • 寄存器和数据大小

  • 请帮助 turbo pascal 程序中的汇编程序

  • 举例说明将字符串输出到屏幕的过程 [关闭]

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5