高级汇编语言技术
子程序的另一种写法
旧的书写形式
assume cs:code,ss:stack
stack segment
db 16 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,1000
call s ;调用子程序
mov ax,4c00H
int 21H
s:
add ax,ax
ret
code ends
end start
为了更好地可读性,类似于C语言大括号进行程序的分块
assume cs:code,ss:stack
stack segment
db 16 dup (0)
stack ends
code segment
main proc
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,1000
call s ;调用子程序
mov ax,4c00H
int 21H
main endp
subp proc
add ax,ax
ret
subp endp
code ends
end start
利用下述格式进行代码的分块,提高可读性
块名称 proc
....
块名称 endp
程序的多文件组织
将功能属性分配到不同文件中
p1.asm
extrn subp:far ;声明subp来自外部,extrn是extern去掉了一个e
assume cs:code,ss:stack
stack segment
db 16 dup (0)
stack ends
code segment
main proc
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,1000
call s ;调用子程序
mov ax,4c00H
int 21H
main endp
code ends
end start
p2.asm
public subp ;对外部声明,subp标号可被外部使用
assume cs:code
code segment
subp proc
s:
add ax,ax
ret
subp endp
code ends
end s
分别编译p1.asm与p2.asm文件,编译结束后将二者链接
masm p1.asm;
masm p2.asm
link p1+p2;
汇编指令汇总
数据传送指令
1)通用数据传输指令:
mov、push、pop、xchg
2)累加器专用传送指令
in、out、xlat
3)地址传送指令
lea、lds、les
4)标志寄存器传送指令
lahf、sahf、pushf、popf
5)类型转换指令
cbw、cwd
算数指令
1)加法指令
add、adc、inc
2)减法指令
sub、sbb、dec、neg、cmp
3)乘法指令
mul、imul
4)除法指令
div、idiv
5)十进制调整指令(BCD调整指令)
daa(压缩BCD加法)、dsa(压缩BCD减法)、aaa(非压缩BCD加法)、aas(非压缩BCD减法)、aam(非压缩BCD乘法)、aad(非压缩BCD除法)
逻辑指令
1)逻辑运算指令
and、or、not、xor、test
2)移位指令
shl、shr、sal、sar、rol、ror、rcl、rcr
串处理指令
1)设置方向标志指令
cld、std
2)串处理指令
movsb/movsw
stosb/stosw
lodsb/lodsw
cmpsb/cmpsw
scasb/scasw
控制转移指令
1)无条件转移指令
jmp
2)条件转移指令
jz/jnz、je/jne
js/jns、jo/jno
jp/jnp、jb/jnb
jl/jnl、jbe/jnbe
jle/jnle
jcxz
3)子程序调用和返回指令
call、ret
4)中断与中断返回指令
int、into、iret
标志处理指令
clc、stc、cmc、cld
std、cli、sti
汇编伪操作汇总
汇编指令:对应机器指令,在程序运行期间有计算机执行
伪操作:在汇编程序对源程序汇编器件,有汇编程序处理的操作,可以完成如数据定义。分配存储区、指示程序结束等功能
伪操作
1)处理器选择伪操作
2)段定义伪操作
3)程序开始与结束伪操作
4)数据定义及存储器分配伪操作
5)表达式赋值伪操作
6)地址计数器与对准伪操作
7)基数控制伪操作
汇编编译过程(经历两次汇编)
1)第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出
2)第二次汇编:标号代真,将字符标号用计算出的地址值或偏移量代换
汇编中的宏定义
应用格式(先定义后调用)
宏名称 macro 变量1,变量2,变量3...
....;汇编指令内容
endm ;结束宏
宏名称 变量1,变量2,变量3...
应用实例
multiply macro opr1,opr2,result
push dx
push ax
mov ax,opr1
imul opr2
mov result,ax
pop ax
pop dx
endm
汇编中的宏与C语言中的宏(define)效果大致相同,都是代码替换。
子程序
优点:模块化,节省内存
缺点:函数调用,开销大
宏定义
优点:传参简单,执行效率高
缺点:代码占用内存空间大
宏定义中的局部标号
汇编指令中,每一个标号不能存在重复,宏中如果需要标号进行跳转的话,需要对标号进行声明
abs mocro oper
local next ;声明该标号为局部标号
cmp oper,0
jge next
neg oper
next:
endm
宏定义的变元
leap macro cond,lab
j&cond lab
endm
宏调用
leap z,there
宏展开后
jz there
宏库:将用到的宏定义分类到不同的红裤文件中
建立宏库macro.mac
macro1 macro [哑元表]
....
endm
macro2 macro [哑元表]
....
endm
macro3 macro [哑元表]
....
endm
在程序中包含宏库并调用宏库
include macro.mac
....
macro1 [实元表]
....
macro2 [实元表]
....
macro3 [实元表]
....
上述宏库的建立原理,类似于C语言中.h文件与.c文件的对应关系
条件汇编
在汇编过程中,根据条件把一段源程序包括在汇编语言程序内或者排除在外(C语言中:#ifdef)
IFxx 自变量
.... ;满足条件则汇编此块
[else]
....;不满足条件则汇编此块
endif
IFxx类型如下
if 表达式 ;表达式 != 0,则汇编
ife 表达式 ;表达式 == 0,则汇编
if1 ;在第一遍扫视器件满足条件
if2 ;在第二遍扫视器件满足条件
ifdef 符号 ;符号已定义,则汇编
ifndef 符号 ;符号未定义,则汇编
ifb 自变量 ;自变量为空,则汇编
ifnb 自变量 ;自变量不空,则汇编
ifidn 字符串1,字符串2 ;串1与串2相同
ifdif 字符串1,字符串2 ;串1与串2不同
退出宏定义:exitm
重复汇编
汇编格式(rept)
rept 表达式
.... ;重复块
endm
应用实例
char = 'A'
table label byte
rept 26
db char
char = char + 1
endm

浙公网安备 33010602011771号