汇编语言程序设计示例

1. 数据处理与拼接

已知 AX=1234H,BX=55AAH,CX=6789H,写一段程序实现:将 AX 寄存器中的中间 8 位取反、BX 的低 4 位和 CX 的高 4 位分别作为新数的中间 8 位、低 4 位、高 4 位拼接成一个新字送到数据段中以 DI 为偏移地址的字存储单元中。

MOV BL, BH  ;保存 BX 低 4 位
MOV BH, CH  ;保存 CX 高 4 位
AND AX, 0FF00H  ;AX 中间 8 位清零
XOR AX, 0FF00H  ;AX 中间 8 位取反
SHR AX, 8  ;将 AX 右移 8 位
OR AX, BX  ;将 BX 低 4 位拼接到 AX 中间 8 位
SHL BX, 4  ;将 BX 左移 4 位
OR AX, BX  ;将 BX 左移后的结果拼接到 AX 低 4 位
SHR CX, 4  ;将 CX 右移 4 位
OR AX, CX  ;将 CX 右移后的结果拼接到 AX 高 4 位
MOV [DI], AX  ;将结果存入数据段中以 DI 为偏移地址的字存储单元中

2. 32 位无符号数除法

已知 DX:AX 存放有一个 32 位无符号数,试写一段程序实现将其除以 4,结果存 DX:AX 中(商的整数部分)。

MOV DX, 0  ;将 DX 清零
MOV BX, 4  ;将除数存入 BX
DIV BX  ;将 DX:AX 除以 BX,结果存入 AX 中,余数存入 DX 中

3. 数据输出

已知以 BX=76ADH,编写 3 个程序分别实现将 BX 的值以 (1) 二进制 (2) 十六进制 (3) 十进制 形式输出。

;输出二进制形式
MOV CX, 16  ;循环 16 次,输出 16 位二进制数
MOV AH, 2  ;设置 DOS 功能调用号
SHR BX, 1  ;将 BX 右移 1 位
JCXZ exit  ;如果 CX 为 0,退出循环
JNC zero  ;如果最后一位为 0,跳转到 zero 标记
MOV DL, '1'  ;最后一位为 1,输出字符 '1'
JMP print  ;跳转到 print 标记
zero:
MOV DL, '0'  ;最后一位为 0,输出字符 '0'
print:
INT 21H  ;输出字符
LOOP  ;循环

exit:
;输出十六进制形式
MOV AH, 2  ;设置 DOS 功能调用号
MOV DL, ' '  ;输出空格
INT 21H  ;输出字符
MOV DL, '0'  ;输出字符 '0'
INT 21H  ;输出字符
MOV DL, 'X'  ;输出字符 'X'
INT 21H  ;输出字符
MOV AX, BX  ;将 BX 的值存入 AX 中
SHR AX, 12  ;将 AX 右移 12 位
CALL print_hex  ;输出高 4 位
MOV AX, BX  ;将 BX 的值存入 AX 中
SHR AX, 8  ;将 AX 右移 8 位
CALL print_hex  ;输出第二个 4 位
MOV AX, BX  ;将 BX 的值存入 AX 中
SHR AX, 4  ;将 AX 右移 4 位
CALL print_hex  ;输出第三个 4 位
MOV AX, BX  ;将 BX 的值存入 AX 中
CALL print_hex  ;输出低 4 位

exit:
;输出十进制形式
MOV AH, 2  ;设置 DOS 功能调用号
MOV DL, ' '  ;输出空格
INT 21H  ;输出字符
MOV AX, BX  ;将 BX 的值存入 AX 中
MOV BX, 10  ;将 10 存入 BX
XOR DX, DX  ;将 DX 清零
DIV BX  ;将 AX 除以 BX,商存入 AX 中,余数存入 DX 中
CMP AX, 0  ;如果商为 0,跳转到 print 标记
PUSH AX  ;将商压入堆栈中
CALL exit  ;递归调用 exit 子程序
POP AX  ;将堆栈中的商弹出
ADD AL, 30H  ;将商转换为字符形式
MOV DL, AL  ;将字符存入 DL 中
INT 21H  ;输出字符
print:
RET  ;退出子程序

print_hex:
PUSH AX  ;将 AX 压入堆栈中
MOV AH, 0  ;将 AH 清零
AND AL, 0FH  ;将 AL 的高 4 位清零
CMP AL, 9  ;如果 AL 小于等于 9,跳转到 skip 标记
ADD AL, 7  ;将 AL 加上 7,得到 A~F 的字符形式
skip:
ADD AL, 30H  ;将 AL 转换为字符形式
MOV DL, AL  ;将字符存入 DL 中
INT 21H  ;输出字符
POP AX  ;将堆栈中的 AX 弹出
RET  ;退出子程序

附:输出单个字符使用 DOS 功能调用中的 2 号功能。

MOV AH, 2
MOV DL, 待输出的字符
INT 21H

例如,下列指令将在屏幕上输出大写字母 A

MOV AH, 2
MOV DL, 41H  ;或 MOV AL, 'A'
INT 21H
汇编语言程序设计:数据处理与输出示例

原文地址: https://www.cveoy.top/t/topic/neWJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录