用汇编语言将 2 个数字相加并打印结果

2023-12-21

我需要有关如何添加两个数字然后打印结果的帮助。
这是我的代码:

    .MODEL SMALL
    .STACK 200H
    .DATA
NUM1 DB 12
NUM2 DB 3
VAL  DB ?
MSG1 DB "The sum is : $"

    .CODE
BEGIN PROC 
      MOV AX, @DATA
      MOV DS, AX

      MOV AL, NUM1
      ADD AL, NUM2
      MOV VAL, AL
     
 

      LEA DX, MSG1
      MOV AH, 9
      INT 21H

      
      MOV AH, 2
      MOV DL, VAL
      INT 21H

      MOV AX, 4C00H
      INT 21H
BEGIN ENDP
      END BEGIN

我得到的输出是:

The sum is 0 

我的代码有什么错误?


通过不断地将值除以 10,您将得到余数中的个位数 - 但顺序“错误”(最后到第一个)。要以“正确”的顺序(从第一个到最后一个)打印它,您可以通过以下方式反转它们PUSHing and POPing(关键字:LIFO = 后进先出):

.MODEL SMALL
.STACK 200H
.DATA
    NUM1 DB 12
    NUM2 DB 3
    VAL  DW ?
    MSG1 DB "The sum is : "
    DECIMAL  DB "00000$"

.CODE
BEGIN PROC
    MOV AX, @DATA
    MOV DS, AX

    XOR AX, AX
    MOV AL, NUM1
    ADD AL, NUM2
    ADC AH, 0
    MOV VAL, AX

    MOV AX, VAL
    CALL AX_to_DEC

    LEA DX, MSG1
    MOV AH, 9
    INT 21H

    MOV AX, 4C00H
    INT 21H
BEGIN ENDP

AX_to_DEC PROC
        mov bx, 10              ; divisor
        xor cx, cx              ; CX=0 (number of digits)

    First_Loop:
        xor dx, dx              ; Attention: DIV applies also DX!
        div bx                  ; DX:AX / BX = AX remainder: DX
        push dx                 ; LIFO
        inc cx                  ; increment number of digits
        test  ax, ax            ; AX = 0?
        jnz First_Loop          ; no: once more

        mov di, OFFSET DECIMAL  ; target string DECIMAL
    Second_Loop:
        pop ax                  ; get back pushed digit
        or ax, 00110000b        ; to ASCII
        mov byte ptr [di], al   ; save AL
        inc di                  ; DI points to next character in string DECIMAL
        loop Second_Loop        ; until there are no digits left

        mov byte ptr [di], '$'  ; End-of-string delimiter for INT 21 / FN 09h
        ret
AX_to_DEC ENDP

END BEGIN
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用汇编语言将 2 个数字相加并打印结果 的相关文章

  • ARMv8 A64 汇编中立即值的范围

    我的理解是 ARMv8 A64 汇编中的立即参数可以是 12 位长 如果是这样的话 为什么这行汇编代码是 AND X12 X10 0xFEF 产生此错误 使用 gcc 编译时 Error immediate out of range at
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

    如果在计算机中一条指令是 16 位 并且如果存储器被组织为 16 位字 则通过在当前指令的地址中加 1 来计算下一条指令的地址 如果内存是按字节组织的 可以单独寻址 那么我们需要在当前指令地址上加二 得到顺序执行的下一条指令的地址 为什么会
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • 如何将 x86 GCC 风格的 C 内联汇编转换为 Rust 内联汇编?

    我在 C 中有以下内联汇编 unsigned long long result asm volatile byte 15 byte 49 shlq 32 rdx orq rdx rax a result rdx return result
  • MikeOS 引导加载程序中的堆栈段

    我不明白这段代码 mov ax 07C0h Set up 4K of stack space above buffer add ax 544 8k buffer 512 paragraphs 32 paragraphs loader cli
  • 设置 IRQ 映射

    我正在遵循一些教程和参考文献来尝试设置我的内核 我在教程中遇到了一些不熟悉的代码 但根本没有解释它 这是我被告知映射的代码16 IRQs 0 15 到 ISR 地点32 47 void irq remap void outportb 0x2
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • GCC的sqrt()编译后如何工作?使用哪种root方法?牛顿-拉夫森?

    只是对标准感到好奇sqrt 来自 GCC 上的 math h 我自己编码的sqrt 使用牛顿拉夫森来做到这一点 是的 我知道 fsqrt 但CPU是如何做到这一点的呢 我无法调试硬件 现代 CPU 中的典型 div sqrt 硬件使用 2
  • 为什么我的代码显示垃圾?

    当我也想打印列表中的每个数字时 我的代码显示垃圾 有什么问题吗 输出应如下所示 给定的数组是 2G 4 PT为什么这是垃圾总数是 7 Code ASSUME CS CODE DS DATA SS STK ORG 0000H DATA SEG
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 如何在Python中高效地添加稀疏矩阵

    我想知道如何在Python中有效地添加稀疏矩阵 我有一个程序 可以将大任务分解为子任务 并将它们分配到多个 CPU 上 每个子任务都会产生一个结果 一个 scipy 稀疏矩阵 格式为 lil matrix 稀疏矩阵尺寸为 100000x50
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v

随机推荐

  • 向字符串类添加函数

    我知道从 std string 类继承是一个糟糕的主意 但只是尝试使用继承向 string 类添加自定义函数以进行虚拟分配 我想将我的函数称为 add 当我执行 str add str1 str2 时它应该在字符串的开头附加 str1 在字
  • 如何使用 Perl 从文件中获取恰好 n 个随机行?

    跟进this https stackoverflow com questions 448005 whats an easy way to read random line from a file in unix command line问题
  • 我的联系表单的提交按钮未提交和重定向

    我正在开发我的第二个网站 在创建这个网站和我的第一个网站的整个过程中 StackOverflow 上的人们给了我很大的帮助 我可以浏览并找到几乎所有我不想知道的东西 我遇到的 99 的问题 我都用我在这里读到的答案解决了 首先非常感谢大家
  • 计算 R 中一个组中两个值同时出现的次数

    我搜索了这个问题的答案并发现了类似的答案 计算每组内的行数 https stackoverflow com questions 9809166 count number of rows within each group 计算 R 数据帧列
  • 提取N位数字的前X位

    如何选择一个数字的前2位数字 我只需要函数的名称 示例 12455 变为 12 13655 变为 13 基本上它相当于整数的子字符串 如果最后您再次需要一个数字向量 元素 您可以使用 as numeric substr x 1 2
  • 当我在 Android 设备上手动安装 app-debug.apk 时,它崩溃了

    当我从 Android studio 运行项目时 我的应用程序在 Android 设备上运行良好 但是 当我在设备上手动安装 app debug apk 时 应用程序在启动时崩溃 并且 app debug unaligned apk 没有生
  • 如何向 text_field_tag 添加占位符?

    我的表格中有以下行 text field tag mother name nil id mother name autocomplete class form group form control autocomplete off data
  • 使用fstream写入

    我试图在指定文件中查找一行并将其替换为我的行 我无法访问将要运行该程序的计算机上的库 因此我创建了一个自定义文件 问题似乎是对 fstream 对象的写入调用 我想知道你们中是否有人可以提供帮助 另外 我的 getline 循环在到达文件末
  • Python Selenium 将数据存储到 CSV 中的特定列?

    我有两份印刷品想写到一张CSV文件存入列A和列B 我的问题是 当我在最后打印 第一次和第二次打印 时 我只得到一个元素 我猜是多次 因为它不在循环之内 print text link 0 9 Result LMFCIIC PWFERT BK
  • 资源泄漏和内存泄漏与性能之间的关系

    对于资源泄漏 我指的是 Streams StreamWriter 我想它们正在消耗文件描述符 Handles GDI 或用户图形字体 很快所有 Closable 对象都可以算作资源 如果应用程序存在一些资源泄漏 假设某些输入流没有关闭 它们
  • 如何在 Zend 框架的 ini 文件中编写路由链……的链?

    我正在尝试使用 Zend 框架的 INI 文件定义如下路由 http api example com servicename http api example com servicename 版本 users userid items it
  • 如何在没有后端的情况下保存用户输入

    我刚刚学习 JavaScript 和 Web 开发 我想知道我想做的事情是否可能 我想编写一个 JavaScript 测验来保存用户输入的答案 而不需要后端 这可能吗 如果不可能 我能做到这一点的最简单和最容易的方法是什么 谢谢 PS 如果
  • 如何将 X11 键符号映射到 Unicode 字符?

    X11 将键码映射到键符号 然后将键符号映射到 Unicode 在程序中检索键符号到 Unicode 映射的好方法是什么 Try this http www cl cam ac uk mgk25 ucs keysym2ucs c
  • 通用 git 重置为默认上游 HEAD

    是否有语法可以重置为当前分支的默认上游 HEAD 就像是 git checkout mybranch git reset hard origin mybranch where origin mybranch可以通用当前分支的上游 HEAD
  • Windows - 无法启动 Git:可能 Git 可执行文件的路径无效

    Can t start Git C Users Cloudion PC AppData Local GitHub PortableGit d93ee8917cfa9add886773e6be9ec08609a502b6 bin git ex
  • 是否有任何理由在 Maven 中为我自己的传递依赖项保留显式依赖项声明?

    我已经阅读了一段时间有关 Maven 中的显式依赖声明与传递 隐式 依赖声明的内容 大多数人倾向于同意您应该始终显式声明项目所依赖的库 主要是为了避免版本不匹配 这是完全合理的 但是我们应该如何解决我们的内部依赖性 如果可以通过传递机制解决
  • 在纯文本 div 中插入新行

    我正在使用一个 CMS 它只允许特定 div 中的文本 HTML 例如 br 被解析为 lt br gt 对于 Unicode HTML 代码 例如 amp 会产生 and x00040 会产生 但它似乎不允许换行 回车 我怎样才能把一个
  • PyBind11 析构函数未调用?

    我有一个c 类包裹着PyBind11 问题是 当Python脚本结束c destructor不会被自动调用 这会导致不整齐的退出 因为网络资源需要由析构函数释放 作为解决方法 有必要显式删除Python反对 但我不明白为什么 请有人解释一下
  • 文本环绕段落中居中的图像

    例如 text text text text text text text text text text text text text text text text text text text text text text text te
  • 用汇编语言将 2 个数字相加并打印结果

    我需要有关如何添加两个数字然后打印结果的帮助 这是我的代码 MODEL SMALL STACK 200H DATA NUM1 DB 12 NUM2 DB 3 VAL DB MSG1 DB The sum is CODE BEGIN PROC