1.子程序的结构
汇编语言中的子程序通常具有以下结构:
子程序名:用于标识子程序的名称。
过程声明:使用特定的指令(如PROC和ENDP)来声明子程序的开始和结束。
参数传递:子程序可以通过寄存器、内存变量或堆栈等方式接收和返回参数。
局部数据存储:子程序可以使用局部变量来存储临时数据,这些数据在子程序执行完毕后会被销毁。
指令序列:子程序包含一系列汇编指令,用于执行特定的任务。
2.子程序的调用和返回
调用子程序:
使用CALL指令来调用子程序。CALL指令会将当前指令的下一条指令的地址压入堆栈,SP变小并且减小2,若初始为0入栈后变为FFFE(-2补码),并跳转到子程序的入口点开始执行。
在调用子程序之前,需要确保所有必要的参数已经传递给子程序。
子程序执行:
子程序在执行过程中,可以访问其局部变量和参数,并执行一系列指令来完成任务。
子程序可以使用RET指令来结束执行并返回到调用点。RET指令会从堆栈中弹出之前压入的返回地址,并跳转到该地址继续执行。
参数传递和返回值:
子程序可以通过寄存器(如AX、BX等)来传递和返回参数。在调用子程序之前,调用者需要将参数放入指定的寄存器中。子程序执行完毕后,可以通过相同的寄存器将结果返回给调用者。
另一种参数传递方式是使用内存变量。调用者可以在内存中分配一个或多个变量来存储参数,并将这些变量的地址传递给子程序。子程序可以通过这些地址来访问和修改参数。
堆栈也可以用于参数传递和返回值。调用者可以将参数压入堆栈,子程序可以从堆栈中弹出参数。同样地,子程序可以将结果压入堆栈,调用者可以从堆栈中弹出结果。
例题:
1、编写输出子程序,把AX中的数以二进制形式输出显示。
AX有16位,循环16次,每次与1相与保留最低位,然后向右循环移位
TWODISP PROC;以二进制显示AX中的数 AX入口参数
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BL,0
MOV DX,1
L0:
MOV CX,AX
AND CX,DX
PUSH CX
INC BL
ROR AX,1
CMP BL,16
JNE L0
L1:
POP DX
ADD DL,48
MOV AH,2
INT 21H
DEC BL
CMP BL,0
JNE L1
POP DX
POP CX
POP BX
POP AX
RET
TWODISP ENDP
2、编写输出子程序,把AX中的数以十六进制形式输出显示。
SHR指令格式:SHR reg/mem i8/CL/1
每次与低4位相与后入栈,然后向右移位4位,AX数据需要循环4次
在输出时有数字字符和字母字符,需要判断
SIXDISP PROC;以16进制显示AX中的数 AX入口参数
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BL,0
MOV DX,15
L0:
MOV CX,AX
AND CX,DX
PUSH CX
MOV CL,4
INC BL
SHR AX,CL;8086必须用CL存位数
CMP BL,4
JNE L0
L1:
POP DX
CMP DL,9
JB L2
ADD DL,37H
JMP L3
L2: ADD DL,48
L3:
MOV AH,2
INT 21H
DEC BL
CMP BL,0
JNE L1
POP DX
POP CX
POP BX
POP AX
RET
SIXDISP ENDP
3、把AX中的数以带符号十进制形式输出显示
因为显示数字时除完商放在8位寄存器,所以正数不能大于2559,负数不能小于-2559
AX中的数字用补码形式存储,也可用反码
DISPLAY_NUM PROC;AX入口参数
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV CH,10
MOV CL,0
MOV BX,AX
AND BX,8000H ;判断正负
CMP BX,0
JE POS
MOV DL,45 ;输出符号ASCII
PUSH AX ;现场保护
MOV AH,2
INT 21H
POP AX
;AND AX,7FFFH ;负数用原码表示 符号位变0
NEG AX ;负数用补码表示求补
;输出无符号十进制
POS:
DIV CH
PUSH AX
ADD CL,1
MOV AH,0
CMP AL,0
JNE POS
DIS:
POP DX
DEC CL
MOV DL,DH
ADD DL,48
MOV AH,2
INT 21H
CMP CL,0
JNE DIS
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY_NUM ENDP
9040

被折叠的 条评论
为什么被折叠?



