展开全部
1的个数用十进32313133353236313431303231363533e58685e5aeb931333262343037制表示的,程序如下:
;7.asm
data segment
string db 3 dup(0),'$' ;保存转换后的余数,初始化为30h,余
;数直接加到对应单元,转化为ascii码
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov dx , 3F2Eh ;预置dx要显示的值
push dx
mov bx,dx
mov cl,4 ;移位指令中用于指定移位次数的值
mov dh , 0 ;dh用于记录循环次数,正计数
again: rol bx , cl ;循环移位指令,完成显示后bx值不变
;从高位开始显示
mov dl , bl ;当前要显示的4位移至最低位上
and dl , 0fh ;清除高4位
cmp dl , 0ah ;若是0~9,则直接加30H显示;
;若是A~F,则另外再加7(41H-0AH=30H+7)
jb disp
add dl , 7
disp: add dl , 30h ;不能使用OR DL,30H,是因为数值可能为A~F
mov ah , 2
int 21h
inc dh ;记录循环次数,达到4次,即结束。
cmp dh , 4
jnz again
mov ah , 02h ;回车换行
mov dl , 0ah
int 21h
mov ah , 02h
mov dl , 0dh
int 21h
mov ah,02h
mov dl,'1'
int 21h
mov dl,'6'
int 21h
pop dx
xor bl,bl
next1: and dx,dx;若dx为0,移位结束
jz next2
shl dx,1
adc bl,0
jmp next1
next2:next2: mov bh,0
mov cx , 10 ;将bl中数据转换成十进制输出,cx为数制转换的基数
lea si , string+4 ;si指针指向缓冲区末尾,依次减量,使余数倒序排列
mov ax , bx ;要转换的数据保存于ax
next3: mov dx , 0 ;除法转换,要使用32位被除数,dx为无符号数的0扩展,每次除法都要进行扩展
div cx ;除法后,ax为商,准备下次除法;dx为余数,值为0~9,
;dl可以保存于string中,用于显示
add dl , 30h ;将余数转换为字符,保存于si指定的缓冲区中
mov [si] , dl
dec si ;指针修改,准备存放下一个余数
cmp ax , 0 ;直到商为0,转换结束
jz over
jmp next3
over: mov dx , si ;使用09号DOS功能调用,显示转换后的字符串
inc dx
mov ah , 09h
int 21h
mov ax , 4c00h
int 21h
code ends
end start
/结果如下:16后面的10是1的个数
J:\masm611>7
3F2E
1610