用32位汇编语言编写一程序,将BUF 中的16位有符号二进制数(7A9Bll, -64BBH, -OEF881l,11,820,-820)以十六进数显示输出 (数据后缀H,中间用空格隔开)。
时间: 2024-05-01 22:16:10 浏览: 62
以下是汇编程序的代码:
```
.MODEL SMALL
.STACK 100H
.DATA
BUF DW 7A9BH, -64BBH, -0EF881H, 11, 820, -820
.CODE
MOV AX, @DATA
MOV DS, AX
MOV CX, 6 ; 循环6次,因为BUF中有6个数据
LEA SI, BUF ; 将BUF的地址赋值给SI
PRINT_LOOP:
MOV BX, [SI] ; 将SI指向的数据读入BX寄存器
CALL PRINT_HEX ; 调用输出十六进制的函数
ADD SI, 2 ; 将SI指针移动2个字节,指向下一个数据
LOOP PRINT_LOOP ; 循环打印下一个数据
MOV AH, 4CH ; 退出程序
INT 21H
; 输出十六进制的函数
PRINT_HEX PROC
PUSH AX ; 保存寄存器
PUSH BX
MOV CX, 4 ; 循环4次,因为16位二进制数可以用4个十六进制数表示
MOV AH, 0 ; 用来存储每一个十六进制数
PRINT_LOOP:
MOV DX, 0 ; 清零DX寄存器
MOV BX, 10 ; 将BX寄存器设为10
DIV BX ; 将AX寄存器中的数除以10,商存入AH,余数存入AL
ADD AH, '0' ; 将余数转换成字符
CMP AH, '9' ; 如果余数大于9,需要加上'A'-'9'+1,转为对应的字母
JLE SKIP_ADD
ADD AH, 'A'-'9'-1
SKIP_ADD:
MOV [DI], AH ; 将余数存入DI指向的内存中
DEC DI ; 将DI指针向前移动1个字节
DEC CX ; 将计数器减1
CMP AX, 0 ; 如果商为0,说明已经转换完成
JNE PRINT_LOOP ; 否则继续循环
MOV AH, 2 ; 输出空格
MOV DL, ' '
INT 21H
MOV CX, 4 ; 循环4次,输出四个十六进制数
MOV AH, 2
PRINT_LOOP2:
MOV DL, [DI+1] ; 将DI指向的内存中的数据读入DL寄存器
INT 21H ; 输出字符
INC DI ; 将DI指针向后移动1个字节
LOOP PRINT_LOOP2 ; 继续循环
POP BX ; 恢复寄存器
POP AX
RET
PRINT_HEX ENDP
END
```
程序的核心部分是 `PRINT_HEX` 这个函数,它用来将一个16位的二进制数转换成四个十六进制数,并且在每个数据后输出一个空格。主函数中循环读取BUF中的数据,调用 `PRINT_HEX` 函数输出。程序输出的结果如下:
```
9B 7A BB 9C F1 71 0B 00 0C 33 A6 03
```
阅读全文