MOV AX,CS 和 MOV DS,AX 的概念

2023-11-24

谁能解释一下这三个指令的功能吗?

  ORG 1000H 
  MOV AX,CS
  MOV DS,AX

理论上我知道代码、数据和额外的段是什么,但是:

  1. 它们在这个程序中是如何实现的?

  2. 为什么整个段被移到另一个段中? (MOV AX,CS and MOV DS,AX)

这两条指令的作用是什么实际上做?

除了突出显示的 3 条指令之外,我可以理解此代码中其他所有指令的含义。

(程序工作正常。它接受输入直到 0 被击中——有一个mov ah,01h and an int 21h,然后比较al to '0' and if al is '0',它跳转到last,否则它会跳入back.)

    ASSUME CS:CODE        
    CODE SEGMENT 
    ORG 1000H
    MOV AX,CS
    MOV DS,AX
BACK:
    MOV AH,01H
    INT 21H
    CMP AL,'0'
    JZ LAST
    JMP BACK
LAST:
    MOV AX,4C00H
    INT 21H
    CODE ENDS

    END

(编者注:.com程序在偏移处加载100h,所有段寄存器设置为彼此相等。org 1000h可能是一个拼写错误org 100h因为这看起来像.com程序。该程序不会中断,因为它不使用任何绝对地址,仅使用相对跳转。)


为了真正解释这个概念,我们必须回顾段的基本概念,以及 x86 如何使用它们(在实模式下)。

8086有20位寻址,但只有16位寄存器。为了生成 20 位地址,它将段与偏移量组合起来。该段必须位于段寄存器(CS、DS、ES 或 SS)中。然后生成一个偏移量(作为立即值或另一个或两个寄存器的内容)。

因此,为了生成地址,将 16 位段寄存器左移 4 位,然后将其他寄存器中的 16 位偏移量添加到其中,合并后的总和实际上用作地址。大多数指令都附加了一个默认段——push, pop以及任何与bp将使用ss。跳跃等使用cs。一些字符串指令es (e.g., scans),有些使用两个段——例如,movsd从复制数据[ds:si] to [es:di]。大多数其他指令使用ds。您还可以使用段覆盖来显式指定地址,例如es:bx.

无论如何,在对段寄存器进行任何有意义的使用之前,您首先必须向其加载您关心的数据的地址(前 16 位)。典型的“小模型”程序将从以下内容开始:

mov ax, @Data
mov ds, ax

在微型模型中,您对数据和代码使用相同的段。为了确保它引用正确的段,您需要从 CS 获取 16 位并将其复制到 DS。正如许多其他人所提到的,没有任何说明可以将 CS 直接移至 DS。这个问题提到了一种可能性;另一个常见的是:

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

MOV AX,CS 和 MOV DS,AX 的概念 的相关文章

  • 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
  • X86 预取优化:“计算 goto”线程代码

    我有一个相当重要的问题 我的计算图有循环和多个 计算路径 我没有制作一个调度程序循环 其中每个顶点将被一一调用 而是将所有预先分配的 框架对象 放置在堆中 代码 数据 这有点类似于线程代码 甚至更好 CPS 只是在堆中跳转 执行代码 每个代
  • 如何在程序中将自己缝合到自己的尾部,无限循环地封装 64KB 代码段?

    如果指令的顺序执行经过偏移量 65535 则8086将从同一代码段中的偏移量 0 处获取下一个指令字节 接下来的 COM 程序利用这一事实 不断将其整个代码 总共 32 个字节 缝合到自己的尾部 环绕在 64KB 代码段中 你可以称之为二元
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 错误 LNK2019:函数 main 中引用的外部符号无法解析

    我正在尝试在 C 中运行我的简单汇编代码 我只有两个文件 cpp 文件和 asm 文件 编译时出现错误 见下文 如果有人可以提供帮助 我将不胜感激 这是我的 main cpp 文件 include
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 调用可以是 cdecl 或 stdcall 的函数

    我需要编写调用外部函数的代码 该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl 我的代码 调用者 无法提前知道其中的哪一个 现在 如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 学习 (N)ASM 的最佳资源是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习汇编已经有一段时间了 尽管我之前尝试过几次 但我还没有真正能够超越 Hello world 有
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?

    To bx对于 Thumb 函数 需要设置地址的最低有效位 GNU 作为文档states https sourceware org binutils docs as ARM Opcodes html当地址是从一个生成时这是如何工作的adr伪
  • 汇编语言程序中连续两次相乘

    我正在使用 8086 模拟器以及 DOSBOX 和 MASM 我知道当我们将 8 位与 8 位相乘时 答案将是 16 位 al 8 bit ax 当我们将 16 位与 16 位相乘时 答案将是 32 位 ax 16 bit dx ax 但如
  • 将十进制转换为十六进制

    首先 这是家庭作业 我正在尝试将 5 位数字读入寄存器 bx 假定该数字不大于 65535 16 位 以下是我尝试这样做的方法 但是 当我尝试打印该号码时 我仅打印输入的最后一位数字 这让我猜测 当我向 bx 添加另一个数字时 它会覆盖以前
  • 在 qemu 中将扇区加载到 RAM

    我编写了一个简单的程序 将扇区 扇区编号 2 加载到 RAM 但什么也没打印 首先 我尝试了以下引导扇区代码 org 0x7c00 mov ax 0x1000 ES BX 1000 0000 mov es ax mov bx 0x00 Lo
  • 如何恢复 x86-64 寄存器保存约定

    fibonacci cmpq 1 rdi ja recursive movl 1 eax ret recursive push rbp push r10 movq rdi r10 leaq 2 rdi rdi call fibonacci

随机推荐

  • 使用 Elastic BeanStalk + Django 设置 ElastiCache Redis

    另一个堆栈溢出answer说您需要设置一个elasticache config文件来自动使用ElastiCache创建Redis服务器 但是 我可以在 AWS Elasticache 上创建一个 Redis 实例并将其端点添加到 Djang
  • 在 C++ 中插入和删除整数中的逗号

    这里非常菜鸟 所以最好假设我对任何答案一无所知 我一直在编写一个小应用程序 它运行良好 但可读性对我的数字来说是一场噩梦 本质上 我想做的就是在屏幕上显示的数字中添加逗号以使其更易于阅读 有没有一种快速且简单的方法可以做到这一点 我一直在使
  • 如何删除 Eclipse Mars Jboss Tools 工具栏项目

    我已经安装了 Eclipse Mars 并且还从 eclipse 市场安装了 Jboss Tools 我的问题是 安装 JBoss 工具后 我的菜单栏中似乎有一组服务器控件 这些控件是按照早期学习中心风格创建的 我已经尝试过 窗口 gt 透
  • Rijndael 256 加密:Java 和 .NET 不匹配

    我需要将 Rijandael 加密的 powershell 脚本转换为 Java 这是源powershell代码 Reflection Assembly LoadWithPartialName System Security Add Typ
  • 您遵循个人软件流程吗?您的组织/团队是否遵循团队软件流程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 了解更多信息 维基百科上的
  • 延迟回调直到脚本添加到文档中?

    如何让回调在脚本实际附加到文档之前不运行 function addScript filepath callback if filepath var fileref document createElement script fileref
  • Strapi - 限制用户仅获取与他相关的数据

    通常 登录用户会获取内容类型的所有条目 我创建了一个 片段 内容类型 id name content users lt lt gt gt snippets lt lt gt gt 表示 具有并属于许多 关系 我创建了一些测试用户并提出请求
  • 在 pyspark 列表中对不同数据帧列求和的正确方法是什么?

    我想对 Spark 数据框中的不同列求和 Code from pyspark sql import functions as F cols A p1 B p1 df spark createDataFrame 1 2 4 89 12 60
  • 如何使用 jQuery 动画更改背景图像?

    我想使用慢速动画更改背景图像 但它不起作用 body stop animate background url 1 jpg slow 语法有问题吗 您可以通过将图像不透明度淡化为 0 然后更改背景图像 最后再次淡化图像来获得类似的效果 这将需
  • 在 R 中强制字符向量编码从“未知”到“UTF-8”

    我有一个问题字符向量编码不一致 in R 我从中读取表格的文本文件已编码 通过Notepad in UTF 8 我尝试过UTF 8 without BOM 也 我想从这个文本文件中读取表格 然后将其转换data table set a ke
  • 如何在 C++ 中高效应用多项式而无需循环? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想获得一些复杂函数的准确近似值 pow exp log log2 比 C 标准库中 cmath 提供的更快 为此 我想利用浮点编码方式并使用位操作获取指数和尾数 然后进行多项式
  • 将包含多个数字的字符串转换为整数

    我意识到这个问题过去可能已经被问过好几次了 但无论如何我都会继续 我有一个程序将从键盘输入中获取一串数字 数字将始终采用 66 33 9 的形式 本质上 每个数字都用空格分隔 并且用户输入将始终包含不同数量的数字 我知道如果每个用户输入的字
  • 在 Firefox 中将焦点设置为 iframe 主体/内容?

    我有一个 iram 它具有隐藏的可见性 我单击按钮 iframe 将可见 我想关注其正文 内容 因为现在我必须单击按钮 然后进入 iframe 所以只需单击两次 我想一键完成 但不知道如何在 Firefox 中聚焦 在资源管理器中就可以了
  • iOS7新更新V 7.1(11D167)不兼容Xcode 5进行开发

    我收到IOS7新版本V7 1的通知 我已经安装在我的 iPhone 4S 上 由于我是开发人员 所以在 Xcode 5 SDK 的开发模式下未检测到我的 iPhone 4S 当我在 Xcode 中打开管理器时 表明 此 iOS SDK 安装
  • 神秘的 Rails 错误几乎没有痕迹

    我们的一个爬虫遇到了一个奇怪的问题 有时它会抛出一个Rails FATAL某些请求出错 但跟踪非常有限 看起来像这样 2014 07 01 18 16 37 FATAL Rails ArgumentError invalid encodin
  • python 字典中长(str)键的效率

    我正在解析一些 xml 使用一些 python 3 4 代码 并希望检索节点中的文本及其 id 属性 例子 li Some text here li 我当前的代码仅围绕文本构建 我现在添加 id 但之前不需要 我正在循环浏览文本 句子列表
  • 为什么 Apache 在 XAMPP 安装中无法启动?

    我已经迈出了学习 PHP 的第一步 认为这将是朝着正确方向迈出的良好一步 不过 我需要一些有关安装 XAMPP 的帮助 我已经通过 Apache Friends 站点下载了该文件和所有内容 但是当我前往控制面板时 我收到了许多错误 这就是它
  • Python scapy 导入错误

    如果我在 python 源文件中包含以下行 from scapy all import 我收到这个错误 from scapy all import ImportError No module named all 这在 Console 和 I
  • 使用点路径键字符串访问 Ruby 哈希

    Rails I18n 库将 YAML 文件转换为可使用 t 函数通过点路径调用访问的数据结构 t one two three four 有谁知道如何使用 Ruby Hash 来做到这一点 或者只能直接通过 YAML 对象实现 只需在路径中的
  • MOV AX,CS 和 MOV DS,AX 的概念

    谁能解释一下这三个指令的功能吗 ORG 1000H MOV AX CS MOV DS AX 理论上我知道代码 数据和额外的段是什么 但是 它们在这个程序中是如何实现的 为什么整个段被移到另一个段中 MOV AX CS and MOV DS