8086组装师

2023-12-31

我在下面的代码中遇到了这个问题,该代码将数字转换为 ASCII“数字文本”。然而,代码似乎在“div”操作码处循环

;Main Program
main:
    mov ax, 0x0000
    mov ds, ax ; setup data segment register
    mov si, GreetString ; setup data segment offset
    call print_string ; call print string procedure
    mov si, DataWord ; setup data segment offset
    mov bl, 0x000A ; base 10
    call format_string ; call format string procedure
    mov si, GreetString ; setup data segment offset
    call print_string ; call print string procedure
prevent_overflow:
    hlt ; halt the CPU
    jmp prevent_overflow

format_string:
mov ax, [ds:si] ; load register ax with data
xor cx, cx ; set counter to 0
mov si, GreetString ; set pointer to address of GreetString

.format_char:
div bl ; divides by register bl
add ah, 48 ; convert to ascii numeric
mov [ds:si], ah ; move ascii numeric to ds:si
inc cx ; increase counter
inc si ; increase si
xor ah, ah ; clear ah register
or ax, ax
jnz .format_char ; jump to format next char
ret

知道为什么会发生这种情况吗?我说“循环”是因为我的 CPU 处于最大值并且不会继续处理 div 之后的操作码

*更新。谢谢纽格雷。添加了主要部分以使其更具可读性 (^.^)


问题是您会遇到除法溢出异常,因为商(在下面的示例中为 12345 div 10 = 1234 + 5 的余数)不适合 8 位al(记住ah已被其余部分使用?)。

每次商或余数不适合目标寄存器时,都会出现除法溢出异常。不仅仅是除以 0 造成的。

您想要进行 32/16=16:16 除法而不是 16/8=8:8 除法。

以下是我所做的更改在 DOS 中的工作原理(标记为;;;):

; file: div2.asm
; compile as: nasm -f bin div2.asm -o div2.com
org 0x100 ;;;

;Main Program
main:
    mov ax, 0x0000
;    mov ds, ax ; setup data segment register ;;;
    mov si, GreetString ; setup data segment offset
    call print_string ; call print string procedure
    mov si, DataWord ; setup data segment offset
    mov bl, 0x000A ; base 10
    call format_string ; call format string procedure
    mov si, GreetString ; setup data segment offset
    call print_string ; call print string procedure

    ret ;;;

prevent_overflow:
    hlt ; halt the CPU
    jmp prevent_overflow

format_string:
mov ax, [ds:si] ; load register ax with data
xor cx, cx ; set counter to 0
mov si, GreetString ; set pointer to address of GreetString

.format_char:
; div bl ; divides by register bl ;;;
xor dx, dx ;;;
xor bh, bh ;;;
div bx ;;;

; add ah, 48 ; convert to ascii numeric ;;;
add dl, 48 ;;;

; mov [ds:si], ah ; move ascii numeric to ds:si ;;;
mov [ds:si], dl ; move ascii numeric to ds:si

inc cx ; increase counter
inc si ; increase si
; xor ah, ah ; clear ah register ;;;
or ax, ax
jnz .format_char ; jump to format next char

mov byte [ds:si], "$" ;;;
inc cx ; increase counter ;;;
inc si ; increase si ;;;

ret

print_string: ;;;
    pusha ;;;
    mov ah, 9 ;;;
    mov dx, si ;;;
    int 21h ;;;
    popa ;;;
    ret ;;;

DataWord dw 12345 ;;;
GreetString db "Hello World!", 13, 10, "$" ;;;

它打印:

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

8086组装师 的相关文章

随机推荐

  • 带有载波上传字段的工厂[重复]

    这个问题在这里已经有答案了 您好 例如 我需要为我的模型建立工厂 Factory define farm do f f name Factory next name f harvest 3 f offers Random f latitud
  • 在.Net 2中使用WCF时int属性为0

    我在 Net 4 中有一个 MVC 项目 其中包含带有 BasicHttpBinding 的 WCF 服务 当在 Net 2 中使用此服务时 如果属性为 int 则到达的值为 0 如果它是一个字符串 那么就可以了 在 Net 4 中构建一个
  • 序列化包含java对象的对象

    我尝试序列化一个包含另一个本身可序列化的对象的对象 有办法让它发挥作用吗 当我序列化第一个对象时 指向另一个对象的指针似乎丢失了 以下是关于持久对象的两条规则 规则 1 要持久化的对象必须实现 Serialized 接口或从其对象层次结构继
  • glGenTextures 在后台线程中返回零

    我需要在 OpenGL ES 的后台线程中加载纹理 但在后台线程中调用时 glGenTextures 始终返回零 void someMethodInMainThread self performSelectorInBackground se
  • 如何读取 Servlet 中的图像(或其他文件)并将其编码为 base64 [重复]

    这个问题在这里已经有答案了 在 servlet 中 我必须从磁盘读取图像文件 将其编码为 Base64 然后发送回客户端 因为我只找到了 iOS Python 和其他一些类型的示例 基本上都以相同的方式进行 所以我想在这里发布我的代码是为了
  • 共享除前缀之外的所有地点或如何使用 PlaceHistoryMapperWithFactory

    在我的 gwt app 中 我有一些地方共享除前缀之外的所有内容 例如 editUserPlace 和 showUserPlace 在这种情况下 状态由 userId 确定 我当前的尝试是通过 ShowUserPlace 和 EditUse
  • GCP 托管实例组不会扩展到零

    我有一个 GCP 托管实例组 我想使用 cron 计划将其扩展至 0 到 1 个实例 GCP 有一个局限性 https cloud google com compute docs autoscaler scaling schedules l
  • 单击正文,但其他一些标签不起作用

    有谁知道 css 位置 相对 可能会搞乱功能 body not theDIV click function alert 或者问题出在其他地方 发生的情况是 我有一个在单击按钮时出现的图标 并且当我单击主体上除 div 本身之外的任何位置时
  • 为什么我的 Gunicorn Python/Flask 工作人员会退出信号术语?

    我有一个 Python Flask Web 应用程序 我正在通过 Gunicorn 将其部署在 Amazon ECS 上的 Docker 映像中 一切都很顺利 然后突然间 包括最后一次成功的请求 我在日志中看到了这一点 2017 03 29
  • 如何将 ctx(上下文)传递给 CliRunner?

    CliRunner未列出任何参数来在其中提供上下文文档 http click pocoo org 5 api click testing CliRunner invoke 以下内容应作为最低限度的工作示例 真正的问题有点不同 可以通过将单击
  • 使用 EditText 显示密码

    我使用 EditText 输入密码 以及一个用于显示密码或不显示密码的复选框 下面是函数的一部分 public void ShowPassword if cb isChecked password setInputType InputTyp
  • tabBar didSelectItem 似乎不起作用

    在我的头文件中我有这个 interface TabBarController UIViewController
  • PHP 将 XML 转换为 JSON

    我正在尝试在 php 中将 xml 转换为 json 如果我使用简单的 xml 和 json encode 进行简单转换 则 xml 中不会显示任何属性 xml simplexml load file states xml echo jso
  • Angular.json 脚本未加载

    我正在尝试使用bootstrap导航栏的示例来自bootstrap文档 如果我从以下位置加载它angular json切换汉堡不起作用 如果我使用的是来自的 CDN 链接bootstrap docs
  • 要求文件作为字符串

    我正在使用 Node Express 我只是想知道如何将任何文件作为字符串导入 假设我有一个 txt 文件 我想要的只是将其加载到这样的变量中 var string require words txt 我反对 modules exports
  • Android 模拟器 - 创建用户帐户时遇到问题

    我的 Android 模拟器中需要一两个用户帐户 以便我可以测试应用程序的一些短信 邮件功能 问题是 当我尝试在模拟器中执行此操作时 设置 gt 帐户和同步 gt 添加帐户 gt my gmail account password gt 下
  • AngularJS Protractor - 如何测试 AJAX 登录调用?

    我有一个按钮 单击后会在 Angular 中发出 AJAX 调用 promise格式 登录成功后会出现 scope变量被更改并且元素如下所示 section Section to display if logged in section 被
  • 安装 Oracle Database Express Edition 11g 时出现问题

    我正在尝试使用 X ubuntu 13 04 64 位安装 Oracle 数据库本指南 http www techienote com 2012 11 step by step guide to install oracle databas
  • 使用 jdk 1.7 启动 Apache James

    我尝试在 Linux Mint 64 位 Debian 上使用 Java jdk 1 7u17 运行 apache james 3 0 beta4 服务器 但由于 JAXB 库错误而无法工作 根据文档 应下载不同的 jar 文件 http
  • 8086组装师

    我在下面的代码中遇到了这个问题 该代码将数字转换为 ASCII 数字文本 然而 代码似乎在 div 操作码处循环 Main Program main mov ax 0x0000 mov ds ax setup data segment re