动态线条
动态线条end

高级汇编语言技术

子程序的另一种写法

旧的书写形式

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
posted @ 2022-01-17 09:14  v1v1v1  阅读(164)  评论(0)    收藏  举报