汇编源程序

汇编源程序

伪指令

伪指令(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值