DOSBox 上的 8086 程序集: idiv 指令有错误?

2024-01-15

我正在帮助我的一个朋友调试他的程序,我们将其范围缩小到甚至在这里出现的问题:

.MODEL small
.STACK 16
.CODE
start:
    mov ax, 044c0h
    mov bl, 85
    idiv bl
exit:
    mov ax, 4c00h
    int 21h

end start

用tasm 4.1组装它,并在DOSBox 0.74上运行它后,它进入了无限循环。当使用涡轮调试器检查它时,我们可以看到它发生在idiv指令,由于某种原因修改了cs and ip寄存器,并且在两条看似随机的指令之后将它们恢复为指向idiv行,无限地再次执行它。

有人对此有任何解释吗?


这个问题是其他除法相关失败的变体。这x86标签维基 https://stackoverflow.com/tags/x86/info有一些额外的链接:

  • idiv / div问题: Zero edx首先,或符号扩展eax进去。 https://stackoverflow.com/questions/38416593/why-should-edx-be-0-before-i-use-div-opcode/38416896#38416896。 32位div如果 64b/32b => 32b 商实际上不适合 32b,则会出错。

您的调试器似乎跳转到的明显随机代码是算术异常处理程序(也与除以零相同)。发生的情况是您的代码正在经历Division Overflow。你正在做一个16位/8位IDIV http://www.felixcloutier.com/x86/IDIV.html。从文档中:

有符号 AX 除以 r/m8,结果存储在:AL ← 商,AH ← 余数。

您会注意到,对于具有 8 位除数的除法(在您的情况下BL) 商的范围是 -128 到 +127。 044c0hIDIV85 是 207(十进制)。 207 不适合有符号的 8 位寄存器,因此您会遇到除法溢出以及意外问题的原因。

要解决此问题,您可以将除数提高到 16 位。所以你可以把你的除数放在BX(16 位寄存器)。那将是mov bx, 85。不幸的是事情没那么简单。当使用 16 位除数时,处理器假定被除数为 32 位,其中高 16 位为DX和低 16 位AX.

有符号 DX:AX 除以 r/m16,结果存储在 AX ← 商,DX ← 余数中。

要解决此问题,您必须对 16 位值进行签名扩展AX。这很简单,因为您只需要使用CWD http://www.felixcloutier.com/x86/CWD:CDQ:CQO.html将值放入后的指令AX。来自指令集参考

DX:AX ← AX 的符号扩展。

有效地,如果最高有效位 (MSB)AX is 0 DX将变为 0。如果 MSB 为 1,则DX将变为 0ffffh(所有位均设置为 1)。数字的符号位是 MSB。

考虑到所有这些,您的除法代码可以调整为采用 16 位除数:

mov ax, 044c0h
cwd                ; Sign extend AX into DX (DX:AX = 32-bit dividend)
mov bx, 85         ; Divisor is 85
idiv bx            ; Signed divide of DX:AX by BX
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DOSBox 上的 8086 程序集: idiv 指令有错误? 的相关文章

  • DASM 汇编器中的 ASCII 到 C64 屏幕代码

    我正在通过 C64 模拟器学习 6502 micro 的汇编 目前正在尝试将字符串输出到屏幕 这是我的代码 processor 6502 org 1000 ldx 00 using x register as column counter
  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 破坏/分解函数的函数

    我以前有过 here https stackoverflow com questions 4920610 c class function in assembly 已经表明 C 函数不容易用汇编表示 现在我有兴趣以一种或另一种方式阅读它们
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • 在 x86 程序集中将整数打印到控制台

    当我在 16 位汇编中添加两个值时 将结果打印到控制台的最佳方法是什么 目前我有这个代码 CODE START mov ax 1 put 1 into ax add ax 2 add 2 to ax current value mov ah
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

    我在用x86GNU 与 GCC 的程序集 并尝试实现相当于以下内容的程序集c c int x 10 x 0 5 但是 当我尝试运行 使用命令 a out 我的汇编代码如下 第一次编译后gcc filename s 错误Segmentatio
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • 汇编8086监听键盘中断

    我有与此完全相同的问题 边画边听键盘 https stackoverflow com questions 13970325 8086 listen to keyboard while drawing 但第一个答案 接受的答案 只听键盘一次
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • Intel 64 和 IA-32 上的 MESI 有何意义

    MESI 的要点是保留共享内存系统的概念 然而 对于存储缓冲区 事情就变得复杂了 一旦数据到达 MESI 实现的缓存 下游内存就会保持一致 然而 在此之前 每个核心可能对内存位置 X 中的内容存在分歧 具体取决于每个核心的本地存储缓冲区中的
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • ARMv8 A64 汇编中立即值的范围

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

随机推荐

  • Mule DataWeave 转换消息因缺少元数据而失败:id 属性

    我有一个非常简单的哈希图有效负载被转换为 application json 我在其他流程中通过将 dataweave 组件拖入并编写映射表达式来完成此操作 现在由于某种原因 我收到以下错误 与元素类型 dw transform messag
  • UIScrollView 内的 UIVIew 反弹回来

    MY app is for iPad using Storyboards with two scenes On one scene I have a UIScrollView that contains a UIVIew It scroll
  • 如何访问Reducer中的Mapper计数器值?

    我想访问reducer中的myCounter my值 public static class Map extends Mapper
  • 在 socket.io 中管理多个选项卡(但同一用户)

    我在使用 socket io 时遇到了一些问题 我不知道如何解决它 我有一个带有登录系统的应用程序 带有 socket io 来管理用户交互 我还有一个数组来管理所有活动的 websocket 会话 该数组存储一对 session id g
  • React Native - 下拉列表中的 z-index 不起作用

    我正在尝试在 React Native 中创建一个基本的下拉菜单 我创建了一个下拉组件 Dropdown import React useState from react import StyleSheet Text View Toucha
  • 如何在AppBar中用图像替换标题

    我怎样才能更换AppBarFlutter 中带有图像徽标的标题 The title属性需要一个Widget 因此您可以将任何小部件传递给它 例如 添加到资源中的图像 Scaffold appBar AppBar title Image as
  • 错误膨胀类 com.google.android.maps.MapView

    我只是遵循一个简单的地图教程http developer android com resources tutorials views hello mapview html http developer android com resourc
  • 根据特定键删除重复项

    得到一个像这样的多维数组 A array 0 gt array rel gt 4 name gt Bar 1 gt array rel gt 2 name gt Bar 2 gt array rel gt 1 name gt Foo 3 g
  • 带有 Google 地图标记的效果和动画

    我想知道如何通过 Google 地图标记创建效果 动画 具体来说 我想在给定的时间后放大 缩小或 淡出 标记 HTML5 可以吗 有没有jquery效果库可以做到这一点 我可以使用地图图块服务器来创建地图图块叠加层并每秒重新生成图块叠加层
  • 使用 LINQ 读取文本文件

    我有一个文件想要读入数组 string allLines File ReadAllLines path to file 我知道我可以遍历数组并找到包含模式的每一行并显示行号和行本身 我的问题是 是否可以使用 LINQ 做同样的事情 嗯 是的
  • 如何在cordova中运行php代码?

    我是 cordova 新手 希望将我现有的应用程序构建与 jquery mobile 和 php 转移到 iOS Android 我对吗 cordova 内部没有 php 解释器 这意味着现有的应用程序无法移植到 cordova 因为 ph
  • Java 如何在结果集中检索超过 100 万行

    我正在对 MYSQL 表执行选择查询 该表有 16 213 156 行和 10 列 但是在建立连接后 代码只执行几分钟 然后抛出错误 线程 Thread 3 中的异常 java lang OutOfMemoryError Java 堆空间
  • 加入范围:has_many:通过关联

    class Users lt ActiveRecord Base has many meetings through gt meeting participations has many meeting participations end
  • 如何使用 php 创建新的 .MDB 文件?

    在我们的内部系统中 我们从 MySQL 数据库为用户 phpexcel 生成了 csv 和 xls 文件 但我的老板询问是否可以创建 mdb 文件 我从未遇到过任何关于动态创建新 MDB 文件的示例 我想知道这是否可能 我无论如何都不是专家
  • 如何使用ajax和jquery动态更新数组表?

    我有两个文件php gettable php和index php 索引文件每隔一秒显示一次gettable php获得的结果 我想在索引中动态更新表的内容 只有新的或更改的值必须更改 使用ajax 我是ajax初学者 请帮帮我 谢谢 获取表
  • PHP Guzzle:空正文响应

    我刚刚开始尝试 guzzle 但我在响应主体上得到一个空字符串 client new Client base uri gt http httpbin org timeout gt 2 0 response client gt request
  • 具有多个描述项的 jQuery 手风琴定义列表

    我似乎无法使用jQuery 手风琴 http jqueryui com demos accordion 具有多个描述项 dd 的定义列表 作者的examples http jquery bassistance de accordion de
  • 有没有一个函数可以将圆的度数移动到0以上?

    我正在 Delphi XE2 中寻找类似于的函数Inc 这允许我从当前的度数中添加 减去一定的度数并产生新的度数 例如 如果我当前有一个点围绕圆 5 度 并且我想减去 10 则不应得到 5 度 而是 355 360 5 与添加过去的 360
  • 将 Yelp API 与 R 结合使用,尝试使用地理坐标搜索业务类型

    尝试使用 R 和库 ROAuth 连接到 yelp API 使用 rauth 模块和地理坐标的很棒的 python 示例 https gist github com phillipjohnson 8889618 https gist git
  • DOSBox 上的 8086 程序集: idiv 指令有错误?

    我正在帮助我的一个朋友调试他的程序 我们将其范围缩小到甚至在这里出现的问题 MODEL small STACK 16 CODE start mov ax 044c0h mov bl 85 idiv bl exit mov ax 4c00h