设计一个延时的子程序,循环程序段执行10000次。调用该子程序可以延时一定的时间
SOFTDLY PROC
MOV BL, 10 ;将10这个数字传入到BL中
DELAY: MOV CX, 1000 ;DELAY是这条指令的名称,方便调用,此处将1000传入CX中
WAIT1: LOOP WAIT1 ;采用计算机给出的LOOP循环指令,LOOP: CX <-- CX-1, 若CX!=0,继续循环调用WAIT1的第一句LOOP指令,直至CX = 0,完成1000次内层循环
DEC BL ;当CX=0时,执行BL的自减指令,BL <-- BL-1
JNZ DELAY ;判断,若BL!=0, 返回到DELAY顺序执行,DELAY-->WAITI
RET ;若BL=0,RET脱离子程序,返回原程序
SOFTDLT ENDP ;子程序结束
SOFTDLY 是该子程序的程序名,不可缺省,方便后面调用
PROC ENDP 是子程序的开始和结束标志,这两个标识符前必须跟子程序名
部分指令解释
LOOP 循环指令
功能: CX = CX-1, 若CX = 0,顺序执行;若CX!=0,循环执行;LOOP的默认寄存器是CX
DEC 减量指令
功能:BX = BX-1,
在此处作为判断语句中的第一句,JNZ用于判断 BX是否为0,若为0则顺序执行,若不为0,则进入DELAY执行
JNZ 判断结果是否不为零
功能:若不为零,进入其后的语句执行,如:JNZ DELAY; 若为零,则顺序执行
;的作用
在汇编语言中,分号后标识注释,同C语言中的#
汇编语言程序架构
完整段定义方式
DATA1 SEGMENT
...... ;数据段用于定义数据
DATA1 ENDS
DATA2 SEGMENT
...... ;数据段用于定义数据
DATA2 ENDS
STACK SEGMENT STACK
...... ;堆栈段,或用于开辟存储空间
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA1,ES:DATA2,SS:STACK
START: MOV AX,DATA1 ;把数据段地址装入数据段寄存器
MOV DS,AX
MOV AX,DATA2
MOV ES,AX
...... ;指令序列
MOV AH, 4CH
INT 21H
CODE ENDS
END START
简化段定义方式
.MODEL SMALL/COMPACT/MEDIUM/LARGE
.386
.DATA
... ;定义数据段
.STACK
... ;定义堆栈段
.CODE
... ;定义代码段 段地址装入必要的附加段寄存器中
END
例题
顺序程序
1.用9号DOS系统功能调用在显示器上显示一个字符串,编写完整的源程序。
DATA SEGMENT
STRING DB 'I Love python!', 0DH, OAH, '$'
DATA ENDS
STACK SEGMENT STACK
DW 10 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK
START: MOV AX, DATA
MOV DS, AX
MOV AH, 09H
MOV DX, OFFSET STRING
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START
2.设变量X、Y均为16位无符号数,试写一个求表达式2X + Y值的程序。
VALUE SEGMENT
X DW 34H
Y DW 65H
Z DW ?,?
VALUE ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:VALUE
START: MOV AX, VALUE ;把所有的变量,先传入AX中
MOV DS, AX ;通过AX把变量放入数据段中 这是不可缺省的两步
XOR DX, DX ;异或将DX清零
MOV AX, X
ADD AX, AX
ADC DX, 0 ;DX用于存放进位即高16位
ADD AX, Y
ADC DX, 0
MOV Z, AX
MOV Z+2, DX ;把高16位放于高位,由于是字(DW)操作,所以单元格+2
MOV AH, 4CH
INT 21H
CODE ENDS
END START