1的个数用十进制表示的,程序如下:
;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
第一题:
CSEG SEGMENT
assume cs:CSEG
MAIN PROC FAR ;主程序入口
mov dx,3f2eh
mov bx,dx
mov cx,4 ;= 这 =
x0: rol bx,1 ;= 些 =
rol bx,1 ;= 是=
rol bx,1 ;=输=
rol bx,1 ;=出=
mov dl,bl ;
and dl,0fh ;
cmp dl,0ah ;
jl x1 ;
add dl,37h ;
jmp x2 ;
x1: add dl,30h ;
x2: mov ah,02h ;
int 21h ;
loop x0 ;
mov dl,0ah ;换行
int 21h
mov dl,31h ;输出16
int 21h
mov dl,36h
int 21h
;按任意键退出
mov ah,1
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
第二题:
CSEG SEGMENT
assume cs:CSEG
MAIN PROC FAR ;主程序入口
mov dx,3f2eh
mov ax,dx
mov bx,0
mov cx,16
x4: ror ax,1
jnc x3
add bx,1
x3: loop x4
mov ax,bx
daa
mov bx,ax
mov cx,4
x5: rol bx,1
rol bx,1
rol bx,1
rol bx,1
mov dl,bl
and dl,0fh
cmp dl,0ah
jl x6
add dl,37h
jmp x7
x6: add dl,30h
x7: mov ah,02h
int 21h
loop x5
;此处添加主程序代码
;按任意键退出
mov ah,1
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
有疑问可以百度HI我= =
1.先显示3F2EH,再另起一行显示16? 如下格式?
3F2EH
16
2.个数还是用十六进制数显示?