1、编写子程序,把一个16位二进制数用十六进制形式显示在屏幕上,分别运用以下2种参数传递方法,并用一个主程序进行验证。 (1) 采用AX寄存器 (2) 采用堆栈
时间: 2023-06-11 12:07:41 浏览: 287
(1) 采用AX寄存器传递参数的子程序:
```assembly
.MODEL SMALL
.STACK 100H
.DATA
BIN DW 1010101010101010B
.CODE
.MAIN PROC
MOV AX, @DATA
MOV DS, AX
CALL BIN2HEX_AX ; 采用AX寄存器传递参数
MOV AH, 4CH
INT 21H
.MAIN ENDP
; 采用AX寄存器传递参数的子程序
BIN2HEX_AX PROC
PUSH BX
PUSH CX
PUSH DX
MOV BX, AX ; 保存传入的二进制数
; 将高8位和低8位分别转换为十六进制
MOV AX, BX
SHR AX, 8
CALL BYTE2HEX
MOV DL, AL
MOV AX, BX
AND AX, 00FFH
CALL BYTE2HEX
MOV AH, DL
; 将结果输出到屏幕上
MOV DL, AH
MOV AH, 2H
INT 21H
MOV DL, AL
INT 21H
POP DX
POP CX
POP BX
RET
BIN2HEX_AX ENDP
; 将一个字节转换为十六进制,并返回ASCII码
BYTE2HEX PROC
PUSH AX
PUSH BX
PUSH CX
MOV BX, AX ; 保存传入的字节
; 将字节右移4位,得到高4位
MOV CL, 4
MOV CH, 0
SHR BL, CL
CALL HEX2ASCII
MOV AH, AL
; 将字节与0FH做与运算,得到低4位
MOV CL, 4
MOV CH, 0FH
AND BL, CH
CALL HEX2ASCII
MOV AL, AH
POP CX
POP BX
POP AX
RET
BYTE2HEX ENDP
; 将一个4位十六进制数转换为ASCII码,并返回
HEX2ASCII PROC
PUSH AX
PUSH BX
MOV BL, AL ; 保存传入的4位十六进制数
CMP BL, 9 ; 如果小于等于9,直接转换为ASCII码
JBE HEX2ASCII1
ADD BL, 7H ; 否则,加上7H得到字母的ASCII码
HEX2ASCII1:
MOV AL, BL
POP BX
POP AX
RET
HEX2ASCII ENDP
END
```
(2) 采用堆栈传递参数的子程序:
```assembly
.MODEL SMALL
.STACK 100H
.DATA
BIN DW 1010101010101010B
.CODE
.MAIN PROC
MOV AX, @DATA
MOV DS, AX
CALL BIN2HEX_STACK ; 采用堆栈传递参数
MOV AH, 4CH
INT 21H
.MAIN ENDP
; 采用堆栈传递参数的子程序
BIN2HEX_STACK PROC
PUSH BP
MOV BP, SP ; BP指向当前堆栈顶部
; 从堆栈中取出传入的二进制数
MOV AX, [BP+4]
; 将高8位和低8位分别转换为十六进制
MOV BX, AX
SHR BX, 8
CALL BYTE2HEX_STACK
MOV DL, AL
MOV AX, BX
AND AX, 00FFH
CALL BYTE2HEX_STACK
MOV AH, DL
; 将结果输出到屏幕上
MOV DL, AH
MOV AH, 2H
INT 21H
MOV DL, AL
INT 21H
POP BP
RET 2 ; 移除传入的参数
BIN2HEX_STACK ENDP
; 将一个字节转换为十六进制,并返回ASCII码
BYTE2HEX_STACK PROC
PUSH BP
MOV BP, SP ; BP指向当前堆栈顶部
; 从堆栈中取出传入的字节
MOV AL, [BP+4]
; 将字节右移4位,得到高4位
MOV CL, 4
MOV CH, 0
SHR AL, CL
CALL HEX2ASCII_STACK
MOV AH, AL
; 将字节与0FH做与运算,得到低4位
MOV CL, 4
MOV CH, 0FH
AND AL, CH
CALL HEX2ASCII_STACK
MOV AL, AH
POP BP
RET 2 ; 移除传入的参数
BYTE2HEX_STACK ENDP
; 将一个4位十六进制数转换为ASCII码,并返回
HEX2ASCII_STACK PROC
PUSH BP
MOV BP, SP ; BP指向当前堆栈顶部
; 从堆栈中取出传入的4位十六进制数
MOV BL, [BP+4]
CMP BL, 9 ; 如果小于等于9,直接转换为ASCII码
JBE HEX2ASCII_STACK1
ADD BL, 7H ; 否则,加上7H得到字母的ASCII码
HEX2ASCII_STACK1:
MOV AL, BL
POP BP
RET 2 ; 移除传入的参数
HEX2ASCII_STACK ENDP
END
```
主程序:
```assembly
.MODEL SMALL
.STACK 100H
.DATA
BIN DW 1010101010101010B
.CODE
.MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 采用AX寄存器传递参数的子程序
MOV AX, BIN
CALL BIN2HEX_AX
; 应输出"AA55"
MOV AH, 9H
MOV DX, OFFSET NEWLINE
INT 21H
; 采用堆栈传递参数的子程序
PUSH BIN
CALL BIN2HEX_STACK
ADD SP, 2 ; 移除传入的参数
; 应输出"AA55"
MOV AH, 9H
MOV DX, OFFSET NEWLINE
INT 21H
MOV AH, 4CH
INT 21H
NEWLINE DB 0DH, 0AH, '$'
.MAIN ENDP
; 采用AX寄存器传递参数的子程序
BIN2HEX_AX PROC
; 同上
BIN2HEX_AX ENDP
; 采用堆栈传递参数的子程序
BIN2HEX_STACK PROC
; 同上
BIN2HEX_STACK ENDP
; 同上
BYTE2HEX_STACK PROC
BYTE2HEX_STACK ENDP
; 同上
HEX2ASCII_STACK PROC
HEX2ASCII_STACK ENDP
END
```
以上程序的输出结果应该是:
```
AA55
AA55
```
阅读全文
相关推荐
![doc](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20241231044833.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231044955.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)