【发布时间】:2018-07-23 02:04:51
【问题描述】:
我正在处理 TASM 汇编中的一个项目,当我在汇编器中使用 32 位寄存器(使用.386)时,我无法将颜色输出到 DOS 控制台的特定单元格。
这是我通常会如何做的一个例子:
单元格的 BX 位置,
AH颜色/单元格字符
mov ah , 01000000b ; Color Red to ah
mov ax,0b800h ; memory location of the console
mov es,ax ; to es
mov es:[bx] , ah ; mov data from ah to the cell of bx
这可行,但是当我在开始时将.386 设置为 32 位时,此代码将停止工作......有人知道解决问题的方法吗?
短的 :
代码需要将 Color 设置为 cell 。在没有 .386 的情况下工作并停止使用 .386
代码段:
.386
.Model small
.data
;all my data
.code
Start:
; all the code in there also the output code snippet I showed
end start
由 Ped7g 修复:
将.386 行放在.code 段内
由玛格丽特布鲁姆修复:
将USE16 修饰符添加到MODEL 指令
两者都在工作。感谢您的帮助
任务 32 位
【问题讨论】:
-
不要认为
.386制作任何 32 位的东西并且应该同样工作。它只是指定您有 386+ 条指令可用。 -
@TomZe - 问题中的示例代码是 16 位代码。请添加示例 32 位代码。您确定该工具集正在构建 16 位 DOS 控制台程序(.COM 或 .EXE)吗?
-
问题是,您使用
.386太早(将使您的.code指令定义32b 保护模式代码段-> 16b 实模式的错误指令操作码)。如果您首先指定.model,然后指定.code段,那么在.code段内使用.386将被不同地处理(代码段将已设置为16b 实模式代码,而.386 将只是允许 32b 英寸)。.dotDirectives是简化的快捷方式,用于以常用方式设置常用事物,因此如果您以错误的顺序使用它们,或者与完整的segment指令/等混合使用,它们可能会损坏。 -
并且...从您的问题中不清楚,您完全了解 16b 实模式和 32b 保护模式之间的区别。您确定要使用 32b 模式指令吗?然后你的
.386是正确的,代码停止工作,因为你没有切换到保护模式,并按原样执行(在保护模式下,你可以将视频内存映射到平面内存寻址映射,所以不需要然后使用段,只需mov ebx,0B8000h- 但这意味着您已经编写了自己的小型操作系统或者您使用了 DOS 扩展器)。 IMO 您更有可能希望保持 16b 实模式,并使用 32b inst./regs. -
@Ped7g - 对于 Masm 6.11 - Microsoft 16 位工具集的一部分,.386 的位置无关紧要,因为 Masm 6.11 只会生成 16 位实模式代码根据需要使用 386 个前缀以在 16 位实模式下使用 32 位寄存器。我不知道同一版本的 Tasm 可以根据 .386 指令所在的位置生成 16 位或 32 位代码。
标签: windows assembly memory dos tasm