汇编语言程序设计:数据处理与输出示例
汇编语言程序设计示例
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 著作权归作者所有。请勿转载和采集!