简明x86汇编语言教程(15)
时间:2025-07-14
时间:2025-07-14
x86汇编语言
那么,最后一段通过DB存放的数据到底保存在哪里了呢?答案是紧挨着代码存放。在汇编语言中,DB和普通的指令的地位是相同的。如果你的汇编程序并不知道新的助记符(例如,新的处理器上的CPUID指令),而你很清楚,那么可以用DB 机器码的方式强行写下指令。这意味着,你可以超越汇编器的能力撰写汇编程序,然而,直接用机器码编程是几乎肯定是一件费力不讨好的事——汇编器厂商会经常更新它所支持的指令集以适应市场需要,而且,你可以期待你的汇编其能够产生正确的代码,因为机器查表是不会出错的。既然机器能够帮我们做将程序转换为代码这件事情,那么为什么不让它来做呢?
细心的读者不难发现,在程序中我们没有对DS进行赋值。那么,这是否意味着程序的结果将是不可预测的呢?答案是否定的。DOS(或Windows中的MS-DOS VM)在加载.com文件的时候,会对寄存器进行很多初始化。.com文件被限制为小于64KB,这样,它的代码段、数据段都被装入同样的数值(即,初始状态下DS=CS)。
也许会有人说,“嘿,这听起来不太好,一个64KB的程序能做得了什么呢?还有,你吹得天花乱坠的堆栈段在什么地方?”那么,我们来看看下面这个新的Hello world程序,它是一个EXE文件,在DOS实模式下运行。
;;; 应该得到一个561 字节的EXE文件
.MODEL SMALL .STACK 200h
CR equ 13 LF equ 10
TERMINATOR equ '$' .DATA
Message DB 'Hello, World !' DB CR,LF,TERMINATOR .CODE
Main PROC mov ax, DGROUP mov ds, ax
mov dx, offset Message mov ah, 9 int 21h
mov ax, 4c00h int 21h Main ENDP
; 终止程序 ; 定义显示串 ; 定义代码段
; 将数据段 ; 加载到DS寄存器 ; 设置DX ; 显示 ; 定义数据段 ; 回车 ; 换行
; DOS字符串结束符 ; 采用“SMALL”内存模型 ; 堆栈段