汇编源程序
伪指令
伪指令(Pseudo instruction)是用于告诉汇编程序如何进行汇编的指令。它既不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。
段定义
段定义伪指令是表示一个段开始和结束的命令,80x86 有两种段定义的方式:完整段定义和简化段定义。
SEG_NAME segment
...
SEG_NAME ends
汇编结束
表示源程序结束的伪操作。
格式:END [label]
可选的标号 label
指示程序开始执行的起始地址,连接程序将据此设置 CS : IP 值。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用 END
而不必指定标号。
指示汇编程序 MASM 到此结束汇编过程。源程序的最后必须有一条 END
语句。
start:
...
END start
db / dw / dd / dq / dt
DB: byte
DW: word
DD: doubleword
DQ: quadword ;每个操作数占有 4 个字,即 8 个字节
DT: ten ;10 个字节
格式:[标号:] DB 表达式表
表达式中可包含符号、字符串、或表达式等项,各个项之间用逗号隔开,字符串应用引号括起来。
括号内的标号是可选项,如果使用了标号,则标号的值将是表达式表中第一字节的地址。
DB
指令必须位于数据段之内,否则将会发生错误。
DATA_SEG segment
db 1 ;01H,在 DATA_SEG:0 处,占 1 个字节
dw 1 ;0001H,在 DATA_SEG:1 处,占 1 个字
dd 1 ;00000001H,在 DATA_SEG:3 处,占 2 个字
strTest db 'test$'
DATA_SEG ends
seg
取标号或者变量名所在的段的段基址
格式:seg 标号/变量名
MY_CODE segment
start:
mov ax, seg MY_DATA
mov ax, seg start
MY_CODE ends
END start
offset
把变量名的地址传输到寄存器中去,在编译之际完成。
格式:mov 寄存器, offset 变量名
DATA_SEG segment
strTest db 'test$'
mov ax, offset strTest
DATA_SEG ends
dup
DUP 是数据定义伪指令,它可以按照给定的次数来复制某个操作数,可以避免多次键入同样一个数据。
格式: db 重复的次数 dup (重复的字节型数据)
DATA_SEG segment
db 1000 dup(0) ;1000 字节全部置为 0
db 256 dup(0, 1, 3, 5) ;循环置为 0, 1, 3, 5
db 256 dub(0, 10 dup(2)) ;1 个 0,10 个 2,循环初始化
DATA_SEG ends
堆栈
未初始化堆栈段 16 位汇编程序,一般情况下,它的代码段和堆栈段有重合的部分,最好自己初始化堆栈段。
MY_STACK segment
db 256 dup(0)
MY_STACK ends
MY_CODE segment
start:
;初始化栈
mov ax, seg MY_STACK
mov ss, ax
MY_CODE ends
END start
helloworld
一个简单的 HelloWorld 程序
MY_DATA segment
strHello db 'Hello world $'
MY_DATA ends
MY_CODE segment
start:
mov ax, seg MY_DATA
mov ds, ax
mov dx, offset strHello
mov ah, 9
int 21h
mov ax, 4c00h
int 21h
ret
MY_CODE ends
END start