DOS int 21 / AH=9 的常量返回值背后的基本原理是什么? (打印字符串中断)

2023-12-09

我正在查看 DOS 的规范int 21h在这里打断http://spike.scu.edu.au/~barry/interrupts.html

我对汇编不太了解,但似乎 AL 寄存器是存储中断返回值的标准。例如,服务01h(读取字符)存储读取的字符。服务 02h(将字符写入标准输出)将最后一个字符输出存储在那里。

但是当 AH=09h(将字符串写入标准输出)时,返回值始终是 24h。这是为什么?

首先,我认为出于某些技术原因必须设置某些值,但情况似乎并非如此。有许多 DOS 服务根本不指定返回值。有些将返回值存储在其他寄存器中,例如 2Ch(获取系统时间)它将结果存储在 CH、CL、DH 和 DL 寄存器中,而不是 AL。

那么为什么中断服务AH=09h要在AL中存储一个值呢?为什么是24小时?


只是为了更多细节:

你可以看到hereMS-DOS v1.25 中该系统调用的源代码:

PRTBUF: ;System call 9
        MOV     SI,DX
OUTSTR:
        LODSB
        CMP     AL,"$"
        JZ      RET20
        CALL    OUT
        JMP     SHORT OUTSTR

它使用LODSB循环中的指令从字符串加载字节,并将它们进行比较$,并将它们写出来。自从LODSB是硬连线加载到AL,循环终止于$被看到,这就是剩下的AL.

DOS API 指定 AX 不需要由系统调用保留(请参阅MS-DOS 程序员参考手册,1.10.4,“寄存器的处理”),并且服务09h的返回值仅被描述为“无”。因此,对于 AL 在退出时应包含的内容,没有任何书面保证;它的内容只是未指定。其他版本的 DOS 可能有不同的行为,因此您显然不应该依赖这种行为。

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

DOS int 21 / AH=9 的常量返回值背后的基本原理是什么? (打印字符串中断) 的相关文章

  • 预取双类成员需要转换为 char*?

    我有一个正在使用的课程 mm prefetch 预先请求包含 double 类型的类成员的缓存行 class MyClass double getDouble return dbl other members double dbl othe
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 尝试使用 x86 程序集 GNU GAS 在数组索引处赋值时出现错误

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

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • AVX-512CD(冲突检测)与原子变量访问有何不同?

    所以我在看他们展示了如何 void Histogram const float age int const hist const int n const float group width const int m const float o
  • 从 exe 文件中获取汇编级代码?

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

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 为什么如果内存组织为字,则程序计数器加 1;如果内存组织为字节,则程序计数器加 2?

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

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地

随机推荐

  • X11中的截图

    使用 Xlib 库可以使用哪些函数来截取 X11 桌面的屏幕截图 我更喜欢一种比获取单个像素更有效的方法 Thanks X11中截屏的 标准工具是使用 xwd root gt myscreen xwd 然后 转换为 pnm xwd2pnm
  • 正则表达式 字符串内只有一个点,不在开头或结尾

    我怎样才能写一个正则表达式 in javascript只允许用户这样写 abc def abc def or abc 所以基本上匹配只包含字母的模式 仅限小写字母 a z and a or 但不匹配 or 在字符串的开头或结尾或多次 只有一
  • 渲染设计编辑密码表单

    我试图在另一个视图中呈现设计编辑密码表单 因为我不想重复编辑密码逻辑 我尝试了以下操作 生成设计视图后 渲染上的许多其他变化似乎都给了我同样的错误 foo foo 中的 ActionView MissingTemplate 缺少部分设备 密
  • .NET 枚举允许在最后一个字段中使用逗号

    为什么这个 NET 枚举允许在最后一个字段中包含逗号 这有什么特殊的意义吗 FlagsAttribute public enum DependencyPropertyOptions byte Default 1 ReadOnly 2 Opt
  • 运行 java -jar 时包含外部 jar

    根据我的阅读 当您执行如下命令时 java jar foo jar 然后主类路径将被忽略 类路径将从清单文件中获取 此外 在命令行上声明的类路径也会被忽略 所以在 java classpath usr local jar foobar ja
  • 在 C# 中使用动态 Or 表达式

    我在程序中使用动态过滤器 如下所示 public static IQueryable
  • 如何在 swift 3 中制作单选按钮

    我正在创建一个 Swift iOS 应用程序 其中我必须显示一个接受水平和垂直方式的单选按钮 我在 GitHub 上找到了一个库 它看起来可以解决我的问题 但它只显示水平方向 并排方向 我需要垂直方向 即在另一个单选按钮下方显示一个单选按钮
  • 在 XSD 中我想指定元素只能有空白内容

    以下 XSD 应允许名为 OnlyWhiteSpaceElement 的元素 该元素具有必需的 Name 属性 并且只能包含空白内容
  • KeyListener 的多键检测 (java)

    如何实现 KeyListener 以便我可以创建一个两人游戏系统 其中一个人使用 和 来控制一个角色 而另一个人可以使用方向键而不互相打扰 我现在的方式是 当一个人按住箭头键时 他们的角色会移动 但是当您使用其他玩家的控件时 第一个人的角色
  • python for循环中的负索引[重复]

    这个问题在这里已经有答案了 我在谷歌搜索时发现了这个问题 但无法理解这是怎么发生的 a 0 1 2 3 for a 1 in a print a 1 Result 0 1 2 2 现在如果我再次打印 a 0 1 2 2 另一个类似的例子 设
  • Android 无需 root 即可访问 ARP 表

    最近在做一个Android项目 需要访问ARP表 要求之一是避免任何需要 root 设备的方法 所以 我的问题是 有没有办法在不root设备的情况下访问android中的ARP表 目前我发现大多数方法都使用 proc net arp 来访问
  • 如何在 jquery DataTable 中保持活动页面

    我在 jquery dataTable 上列出了一些数据 并且由 DataTable 插件默认完成分页 我想在处理数据时获取数据表的当前页面 并在处理操作后将该页面设置为活动状态并重新加载数据 看看这个小提琴 您可以看到如何获取当前页面 在
  • 关于如何更改通知接收器中的 setLatestEventInfo 的替代方法

    您好 我在这一点上有库存 其中 setLatesEventInfo 有错误 我知道 setLatestEventInfo 不能在 API 23 及更高版本上运行 有人可以帮助我如何让这段代码运行吗 我的意思是替代方法 功能相同但编码不同 这
  • 具有有效证书的 Spring Boot https 获取 ERR_SSL_VERSION_OR_CIPHER_MISMATCH,自签名工作正常

    我正在运行 Spring Boot 1 4 0 RELEASE 我从 IT 部门获得了有效证书 我使用 IT cert cer 生成了 tomcat keystore jks 文件 keytool keystore tomcat keyst
  • OctoberCMS Builder插件,上传文件并存储在数据库中

    我是新来的十月CMS我正在尝试使用创建一个插件构建器插件其本身十月CMS提供OctoberCMS 构建器插件称为类似 社交链接 一切正常 但我无法理解将文件上传到任何目录并将该名称存储到我的数据库表的特定字段的逻辑 我的表的字段名称是 社交
  • JQPlot放大图表并使用replot功能

    我在用jqplot在我的网站上绘制图表 我想为用户提供通过插入来放大图表的可能性Trigger link如下图 此链接旨在显示带有放大图表的弹出窗口 我发现显示图表div这是隐藏的需要调用replot 在特定情节上发挥作用 我正在使用的代码
  • NUMA:如何检查 C++ 数组分配在 RAM 的哪一部分?

    我有一台带有 2 个 CPU 和 64GB RAM 的服务器 每个 CPU 32GB 我知道每个 CPU 都有自己的 RAM 部分 我们称它们为 RAM1 和 RAM2 我想让我的程序知道它在哪个 RAM RAM1 或 RAM2 上分配数据
  • Github actions - 如何获取每个分支中从 1 开始的内部版本号

    假设我有这些分支 main feature1 feature2 在我的 github 操作中 我需要知道我推送到分支或手动触发该分支上的操作的次数是多少 With github run attempt 每次我按我都会得到号码1 如果我手动重
  • 为什么我需要 git merge origin/master 中的“master”?

    使用 git 并且您希望从服务器获取更改时的约定是 git fetch git merge origin master 我知道还有git pull 但我的具体问题是关于语法的origin master 什么是master部分做什么 如果我只
  • DOS int 21 / AH=9 的常量返回值背后的基本原理是什么? (打印字符串中断)

    我正在查看 DOS 的规范int 21h在这里打断http spike scu edu au barry interrupts html 我对汇编不太了解 但似乎 AL 寄存器是存储中断返回值的标准 例如 服务01h 读取字符 存储读取的字