简明x86汇编语言教程(14)
时间:2025-07-14
时间:2025-07-14
x86汇编语言
.MODEL TINY .CODE
CR equ 13 LF equ 10
TERMINATOR equ '$'
ORG 100h
Main PROC
mov dx,offset sMessage mov ah,9 int 21h mov ax,4c00h int 21h Main ENDP
sMessage:
DB 'Hello, World!' DB CR,LF,TERMINATOR
END Main
; .COM文件的内存模型是‘TINY’ ; 代码段开始 ; 回车 ; 换行
; DOS字符串结束符
; 代码起始地址为CS:0100h
; 令DS:DX指向Message ; int 21h(DOS中断)功能9 - ; 显示字符串到标准输出设备 ; int 21h功能4ch - ; 终止程序并返回AL的错误代码
; 程序结束的同时指定入口点为Main
那么,我们需要解释很多东西。
首先,作为汇编语言的抽象,C语言拥有“指针”这个数据类型。在汇编语言中,几乎所有对内存的操作都是由对给定地址的内存进行访问来完成的。这样,在汇编语言中,绝大多数操作都要和指针产生或多或少的联系。
这里我想强调的是,由于这一特性,汇编语言中同样会出现C程序中常见的缓冲区溢出问题。如果你正在设计一个与安全有关的系统,那么最好是仔细检查你用到的每一个串,例如,它们是否一定能够以你预期的方式结束,以及(如果使用的话)你的缓冲区是否能保证实际可能输入的数据不被写入到它以外的地方。作为一个汇编语言程序员,你有义务检查每一行代码的可用性。 程序中的equ伪指令是宏汇编特有的,它的意思接近于C或Pascal中的const(常量)。多数情况下,equ伪指令并不为符号分配空间。
此外,汇编程序执行一项操作是非常繁琐的,通常,在对与效率要求不高的地方,我们习惯使用系统提供的中断服务来完成任务。例如本例中的中断21h,它是DOS时代的中断服务,在Windows中,它也被认为是Windows API的一部分(这一点可以在Microsoft的文档中查到)。中断可以被理解为高级语言中的子程序,但又不完全一样——中断使用系统栈来保存当前的机器状态,可以由硬件发起,通过修改机器状态字来反馈信息,等等。