微机原理与接口技术 编写1个程序,统计寄存器AX中二进制位1的个数,结果以1位十六进制数形式显示到屏幕上
答案:2 悬赏:20 手机版
解决时间 2021-04-16 09:01
- 提问者网友:蓝莓格格巫
- 2021-04-15 10:44
微机原理与接口技术 编写1个程序,统计寄存器AX中二进制位1的个数,结果以1位十六进制数形式显示到屏幕上
最佳答案
- 五星知识达人网友:刀戟声无边
- 2021-04-15 11:43
code segment
assume cs:code
start:
mov ax,0ffffh ;测试用的,你可以修改为任何有效的值
mov cl,16 ;ax是一个字,有16位二进制
mov dl,0 ;用于累加ax中1的个数
a:
rol ax,1 ;循环左移1称,16次循环后复原
jnc next ;该位是0,则CF=0,这里就是测试CF的值,为0则跳转不累加
inc dl ;CF=1时,dl+1
next:
loop a ;循环结构
add dl,30h ;将dl的值转为ASCII码
cmp dl,'9' ;大于9则是A-F或者10
jbe print ;小于或者等于0则不必再转化ASCII码
add dl,7 ;如果是A-F则转化
cmp dl,'F' ;这步关键,如果AX的值是0FFFFH,则dl=16=10H,没有这步将会输出G
ja print_10 ;AX=0FFFFH则跳转进行特殊处理
print:
mov ah,02h
int 21h
print_10:
mov dl,31h ;特殊情况只有一种,即dl=10H,故只要两次分别输出字符1和0即可
mov ah,02h
int 21h
mov dl,30h
int 21h
mov ah,4ch
int 21h
code ends
end start
assume cs:code
start:
mov ax,0ffffh ;测试用的,你可以修改为任何有效的值
mov cl,16 ;ax是一个字,有16位二进制
mov dl,0 ;用于累加ax中1的个数
a:
rol ax,1 ;循环左移1称,16次循环后复原
jnc next ;该位是0,则CF=0,这里就是测试CF的值,为0则跳转不累加
inc dl ;CF=1时,dl+1
next:
loop a ;循环结构
add dl,30h ;将dl的值转为ASCII码
cmp dl,'9' ;大于9则是A-F或者10
jbe print ;小于或者等于0则不必再转化ASCII码
add dl,7 ;如果是A-F则转化
cmp dl,'F' ;这步关键,如果AX的值是0FFFFH,则dl=16=10H,没有这步将会输出G
ja print_10 ;AX=0FFFFH则跳转进行特殊处理
print:
mov ah,02h
int 21h
print_10:
mov dl,31h ;特殊情况只有一种,即dl=10H,故只要两次分别输出字符1和0即可
mov ah,02h
int 21h
mov dl,30h
int 21h
mov ah,4ch
int 21h
code ends
end start
全部回答
- 1楼网友:雪起风沙痕
- 2021-04-15 12:12
assume cs:code, ds:data
data segment
tb db '0123456789ABCDEF'
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 3ch
mov cx, 16
xor bx, bx
nx:
rol ax, 1
test al, 1
jz zero
inc bx
zero:
loop nx
mov ax, bx
lea bx, tb
xlat
mov ah, 2
mov dl, al
int 21h
mov ax, 4c00h
int 21h
code ends
end start
data segment
tb db '0123456789ABCDEF'
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 3ch
mov cx, 16
xor bx, bx
nx:
rol ax, 1
test al, 1
jz zero
inc bx
zero:
loop nx
mov ax, bx
lea bx, tb
xlat
mov ah, 2
mov dl, al
int 21h
mov ax, 4c00h
int 21h
code ends
end start
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯