汇编语言:. 将DX寄存器中的二进制数(3 F 2 E H)以十六进制数形式显示在屏幕上;然后换行从

2025-05-21 07:19:49
推荐回答(3个)
回答(1):

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

回答(2):

第一题:
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我= =

回答(3):

1.先显示3F2EH,再另起一行显示16? 如下格式?

3F2EH
16

2.个数还是用十六进制数显示?