热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

汇编器使用段寄存器

如何解决《汇编器使用段寄存器》经验,为你挑选了1个好方法。

最近,我正在编写程序集,并且我编写的程序在DOSBox下运行没有任何问题。现在,我需要使用DOS将同一程序移植到实际计算机中,但是会出现一些问题。

首先,在DOSBox下,我正在使用ML进行编译,但是在真正的PC上,一旦输入ML,它就会说:

该程序不能在DOS模式下运行。

因此,我一直在寻找一种解决方案,并发现MASM可以毫无问题地编译asm程序。不幸的是,我需要移植的程序在编译时报告严重错误(仅1种类型)。

错误A2061:段寄存器使用不当

出现这些问题的路线如下

...
CARLOC EQU $-2
...
MOV [WORD PTR DS:CARLOC],DX
...

以下代码也会出现相同的问题

...
MOV ES,CX
MOV AL, [BYTE PTR ES:0017H]
...

到目前为止,我已经尝试将BYTE PTR [ES:0017H] 产生相同错误的BYTE PTR更改为

BYTE PTR ES:0017H 成功地在 其中编译了代码,该程序运行了但无法正常运行

注意:我不知道当前在哪种架构下工作。可能无法物理访问该计算机,但是如果我可以键入一些代码来查看屏幕上的信息,我将很高兴这样做。

代码在这里,如果我需要在这里粘贴它就太长了,然后确定,但是直到那时https://pastecode.xyz/view/5f332efc

PC说它运行MSDOS 6



1> Peter Cordes..:

(更新:Michael Petch说一些与 MASM或MASM兼容的汇编器允许在括号使用大小和段覆盖。但是update2:并非全部,因此这实际上可能是问题所在。至少是标准样式,因此我建议始终这样做)


使用所需的常规MASM语法MOV [CARLOC], DX 根据您声明的方式carloc,您可能仍然需要mov word ptr [CARLOC], dx,但是DS:已经是默认段。

如果您想对此进行明确说明,MOV word ptr ds:[CARLOC], dx但我建议在asm源代码中省略冗余DS前缀,因为某些汇编程序的机器代码中包括冗余DS前缀!DS:唯一不是唯一的时间是当与,ds:[bp]或ebp或一起使用时ds:[esp],这暗示SS是默认段。

对于MASM,ds:还需要数字绝对地址作为前缀。否则,将其视为立即目的地(不考虑方括号),而该目的地当然不是目的地。使用这样的定义CARLOC equ $-2,您将需要ds:[CARLOC]。显然,MASM不会ds在机器代码中添加无用的前缀,因此您不必担心该汇编程序。

如果需要CS / DS / ES / FS / GS / SS前缀,则标准语法是将其放在方括号之外:

MOV AL, ES:[0017H]

AL目的地表示byte ptr操作数大小,该大小也超出了括号。例如,查看反汇编程序输出。

BYTE PTR ES:0017H成功地将代码编译到其中,

是的,这是有效的语法:方括号在某些情况下是可选的(包括绝对地址或符号)。许多人建议始终在存储操作数周围使用括号(而不是OFFSET symbol立即数),以使读者更容易理解。

如果您要使用方括号,它们会在size ptrseg:替代之后。

该程序已运行但无法正常运行

然后,您的代码中除了语法错误之外,还有其他错误。

或者,如果您尝试将其构建为Windows可执行文件:当然,将为DOS编写的代码(实模式,在整个计算机的控制下)并以32位或64位构建为代码是行不通的Windows可执行文件(保护模式或64位模式,在操作系统下为Ring 3)。系统调用ABI甚至API也完全不同:它们是不同的操作系统,而DOS API对Windows可执行文件不可用。

Michael还建议,USE32或其他指令可能会使MASM试图将您从自己身上救出来,并拒绝在应该与平面内存模型一起运行的代码中使用分段。但是,如果es:[17H]可行,那可能不是。


推荐阅读
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • 本文详细介绍了如何在预装Ubuntu系统的笔记本电脑上安装Windows 7。针对没有光驱的情况,提供了通过USB安装的具体方法,并解决了分区、驱动器无法识别等问题。 ... [详细]
  • 本文详细介绍了福昕软件公司开发的Foxit PDF SDK ActiveX控件(版本5.20),并提供了关于其在64位Windows 7系统和Visual Studio 2013环境下的使用方法。该控件文件名为FoxitPDFSDKActiveX520_Std_x64.ocx,适用于集成PDF功能到应用程序中。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 为了使您的电脑更加个性化,许多用户希望为Windows 10桌面设置自己喜欢的多张图片。本文将详细介绍如何轻松实现这一目标,并提供一些专业建议,确保您能够充分利用系统功能。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 如何在电脑上同时登录多个微信账号?实用技巧全解析
    本文详细介绍了如何在电脑上同时登录多个微信账号的方法,并分享了一些微信的隐藏小技巧,帮助用户更高效地使用微信。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 解决Windows 10开机频繁自检问题的实用方法
    许多用户在使用Windows 10系统时,经常会遇到开机时自动进行磁盘检查的情况。这不仅影响了开机速度,还可能带来不必要的麻烦。本文将详细介绍如何通过简单的注册表修改来避免每次开机时的磁盘自检,提升系统启动效率。 ... [详细]
  • 探索金山WPS2000专业版中被遗忘的实用功能
    金山WPS作为国产办公软件中的佼佼者,以其与Office相似的界面和功能广受用户喜爱。然而,随着时间的推移,一些早期版本中的独特功能逐渐被忽视。本文将带您回顾并重新发现这些曾经便捷且实用的功能。 ... [详细]
  • 探索新一代API文档工具,告别Swagger的繁琐
    对于后端开发者而言,编写和维护API文档既繁琐又不可或缺。本文将介绍一款全新的API文档工具,帮助团队更高效地协作,简化API文档生成流程。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
author-avatar
爬树小羊_298
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有