微机原理与接口技术 编写1个程序,统计寄存器AX中二进制位1的个数,结果以1位十六进制数形式显示到屏幕上
推荐于2018-03-01
展开全部
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
2013-06-05
展开全部
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
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询