编写程序,设有10个无符号数的字节序列,利用子程序的方法编程,求出该序列中的最大值和最小值。最大值放在BH,最小值放在BL(显示一位16进制)
时间: 2023-10-10 16:09:30 浏览: 156
以下是一个汇编语言的程序,实现了求出10个无符号数的字节序列中的最大值和最小值,并将最大值存放在BH寄存器中,最小值存放在BL寄存器中。
```
ORG 0x100
START:
MOV CX, 10 ; 设置循环计数器为10
MOV BL, 0xFF ; 设置最小值为255
MOV BH, 0x00 ; 设置最大值为0
LOOP_START:
MOV AL, [SI] ; 从内存中读取一个字节到AL寄存器中
CMP AL, BH ; 比较AL和BH寄存器中的值
JBE NOT_MAX ; 如果AL小于或等于BH,则跳转到NOT_MAX标签
MOV BH, AL ; 将AL的值赋给BH寄存器
NOT_MAX:
CMP AL, BL ; 比较AL和BL寄存器中的值
JAE NOT_MIN ; 如果AL大于或等于BL,则跳转到NOT_MIN标签
MOV BL, AL ; 将AL的值赋给BL寄存器
NOT_MIN:
INC SI ; 增加指向内存地址的指针
LOOP LOOP_START ; 循环
; 显示结果
CALL SHOW_RESULT
JMP $ ; 程序结束,跳转到当前地址
SHOW_RESULT:
; 将最大值和最小值转换为16进制并显示出来
MOV DL, BH ; 将BH寄存器中的值赋给DL寄存器
CALL HEX_OUT ; 显示DL的值
MOV DL, BL ; 将BL寄存器中的值赋给DL寄存器
CALL HEX_OUT ; 显示DL的值
RET ; 返回
HEX_OUT:
; 将DL寄存器中的值转换为16进制并显示出来
PUSH AX ; 保存AX寄存器的值
PUSH BX ; 保存BX寄存器的值
PUSH CX ; 保存CX寄存器的值
XOR AH, AH ; 将AH寄存器清零
MOV BX, 10 ; 设置除数为10
DIV BX ; 将DL寄存器中的值除以10,商在AH,余数在AL
ADD AL, '0' ; 将余数转换为ASCII码
CMP AH, 0 ; 如果商为0,说明转换完成
JZ HEX_OUT_DONE ; 转换完成,跳转到HEX_OUT_DONE标签
PUSH DX ; 保存DX寄存器的值
MOV DL, AH ; 将商赋给DL寄存器
CALL HEX_OUT ; 递归调用HEX_OUT子程序
POP DX ; 恢复DX寄存器的值
HEX_OUT_DONE:
MOV AH, 0x02 ; 设置中断号为2,表示显示一个字符
INT 0x21 ; 调用中断
POP CX ; 恢复CX寄存器的值
POP BX ; 恢复BX寄存器的值
POP AX ; 恢复AX寄存器的值
RET ; 返回
```
需要注意的是,这段程序使用了中断来显示结果,所以需要在DOS环境下运行。在汇编代码中,`ORG 0x100` 表示程序的入口地址为100H,`MOV CX, 10` 表示循环计数器的初值为10,`MOV BL, 0xFF` 和 `MOV BH, 0x00` 分别表示最小值和最大值的初值。在循环中,每次从内存中读取一个字节到AL寄存器中,然后比较AL和BH的值,如果AL大于BH,则将AL的值赋给BH;接着比较AL和BL的值,如果AL小于BL,则将AL的值赋给BL。最后,将最大值和最小值转换为16进制并显示出来。
阅读全文