8086emu子程序怎么写
时间: 2023-07-03 08:04:28 浏览: 129
8086汇编子程序可以使用PROC和ENDP伪指令来定义。以下是一个简单的示例:
```
; 定义子程序
MY_SUB PROC
push bp ; 保存现场
mov bp, sp ; 设置堆栈指针
; 子程序代码在这里
pop bp ; 恢复现场
ret ; 返回
MY_SUB ENDP
; 调用子程序
call MY_SUB
```
在子程序中,您可以使用堆栈来传递参数和保存现场。使用RET指令返回主程序。
请注意,在8086汇编中,子程序的名称必须以字母开头,并且不能以数字或其他特殊字符开头。
相关问题
使用emu8086编写子程序,删除字符串中从第n个字符开始的m个字符。
以下是使用emu8086汇编语言编写的删除字符串子程序:
```assembly
; 删除字符串中从第n个字符开始的m个字符
; 输入:si指向字符串首地址,n为开始位置,m为删除的字符数
; 输出:字符串中删除了对应的字符
delete_str:
push bp
mov bp, sp
push si
push di
mov si, [bp+4] ; si指向字符串首地址
mov di, si ; di保存字符串首地址
mov cx, [bp+6] ; cx保存n的值,即开始位置
sub cx, 1 ; 将n转化为偏移量
add si, cx ; si指向第n个字符
mov di, si ; di指向第n个字符,准备删除
mov cx, [bp+8] ; cx保存m的值,即删除的字符数
delete_loop:
mov al, [si+cx] ; 将si+cx位置上的字符保存到al中
mov [di], al ; 将al中的字符复制到di位置上
inc di ; di指向下一个字符
cmp al, '$' ; 判断是否到字符串结尾
je delete_end ; 到结尾了就结束循环
jmp delete_loop
delete_end:
mov [di], '$' ; 在删除后的字符串末尾加上结束标志
pop di
pop si
pop bp
ret
```
以上代码实现了删除字符串中从第n个字符开始的m个字符的功能。在使用时,需要将字符串首地址、开始位置n、删除的字符数m依次压入栈中,然后调用delete_str子程序即可完成删除操作。
使用 emu8086 编写子程序,把一个16位二进制数用十六进制形式显示在屏幕上,分别运用以下2种参数传递方法,并用一个主程序进行验证。 (1) 采用AX寄存器 (2) 采用堆栈
以下是使用 AX 寄存器传递参数的子程序:
```
; 子程序:将16位二进制数转换为16进制并显示在屏幕上
; 输入:AX 中存储着一个16位的二进制数
; 输出:无
BIN2HEX PROC
PUSH AX ; 保存 AX 的值
MOV BX, 1000b ; BX = 1000b,用于转换二进制位为16进制位
MOV CX, 4 ; CX = 4,循环4次,将16位二进制数转换为4位16进制数
LOOP1:
ROR AX, 1 ; 将 AX 中最低位的二进制数移到 CF 中
ADC BL, BL ; 将 CF 中的二进制数加到 BL 中
ADC BL, 0 ; 将 CF 置为0
DEC BX ; BX 自减,用于判断当前是不是4位二进制数
JNZ LOOP1 ; 如果 BX 不为0,继续循环
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR1 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR1:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BH 中的16进制数转换为字符
MOV AL, BH ; AL = BH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR2 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR2:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 AH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 AH 中的16进制数转换为字符
MOV AL, AH ; AL = AH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR3 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR3:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR4 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR4:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
POP AX ; 恢复 AX 的值
RET ; 返回主程序
BIN2HEX ENDP
```
以下是使用堆栈传递参数的子程序:
```
; 子程序:将16位二进制数转换为16进制并显示在屏幕上
; 输入:堆栈中存储着一个16位的二进制数
; 输出:无
BIN2HEX PROC
PUSH BP ; 保存 BP 的值
MOV BP, SP ; 将 SP 的值赋给 BP,用于访问堆栈中的参数
MOV AX, [BP+4] ; AX = 输入的16位二进制数
MOV BX, 1000b ; BX = 1000b,用于转换二进制位为16进制位
MOV CX, 4 ; CX = 4,循环4次,将16位二进制数转换为4位16进制数
LOOP1:
ROR AX, 1 ; 将 AX 中最低位的二进制数移到 CF 中
ADC BL, BL ; 将 CF 中的二进制数加到 BL 中
ADC BL, 0 ; 将 CF 置为0
DEC BX ; BX 自减,用于判断当前是不是4位二进制数
JNZ LOOP1 ; 如果 BX 不为0,继续循环
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR1 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR1:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BH 中的16进制数转换为字符
MOV AL, BH ; AL = BH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR2 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR2:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 AH 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 AH 中的16进制数转换为字符
MOV AL, AH ; AL = AH
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR3 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR3:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
; 将 BL 中的值转换为16进制字符
MOV AH, 0 ; AH = 0,用于将 BL 中的16进制数转换为字符
MOV AL, BL ; AL = BL
AND AL, 0Fh ; 只保留 AL 中的低4位
CMP AL, 9 ; 如果 AL 是10~15,需要将其转换为 A~F
JBE CHAR4 ; 如果 AL <= 9,直接转换为字符
ADD AL, 7 ; 如果 AL >= 10,将其转换为 A~F
CHAR4:
ADD AL, 30h ; 将 AL 转换为ASCII码
MOV DL, AL ; DL = AL,用于显示字符
MOV AH, 2 ; 调用 BIOS 中断显示字符
INT 21h ; 显示 DL 中的字符
POP BP ; 恢复 BP 的值
RET 2 ; 返回主程序,并将堆栈指针恢复到原来的位置
BIN2HEX ENDP
```
以下是验证程序:
```
ORG 100h
MOV AX, 1010101010101010b ; 输入一个16位的二进制数
; 使用 AX 寄存器传递参数
CALL BIN2HEX
; 使用堆栈传递参数
PUSH AX
CALL BIN2HEX
ADD SP, 2
MOV AH, 4Ch ; 退出程序
INT 21h
END
```
阅读全文