汇编语言二进制转换为十六进制并显示的程序(简化段程序),能不能详细解说一下啊,真的有点不懂

如题所述

dseg segment
  msg0 db 'Input Binary Num:$'
  msg1 db 0dh,0ah, 'Hex Num:$'
  inBin db 17         ;存储输入的2进制字符串,最大长度16, 最后一个字符存储回车
        db 0          ;实际的输入长度
        db 17 dup(0)  ;存储输入的字符串
  n     dw 0
dseg ends

assume cs:cseg, ds:dseg
cseg segment
start:
  mov ax, dseg
  mov ds, ax

  call readBin  ;调用输入2进制的函数,结果存储在n中
  call outHex   ;调用将n按16进制输出的函数

  mov ax, 4c00h
  int 21h

readBin proc near
  mov ah, 9    ;输出
  lea dx, msg0 ;msg0
  int 21h      ;这个字符串

  mov ah,10     ;读取输出的字符串到inBin中
  lea dx, inBin ;
  int 21h       ;

  mov cl, inBin+1  ;输入的字符串长度放入cx中
  mov ch, 0        ;
  mov bx, 2        ;bx指向第1个实际输出字符的位置
  xor ax, ax       ;ax清0
r0:
  mov dl, inBin[bx] ;读取第[bx]个输入的字符
  and dl, 0FH       ;字符转换为实际的数值 0或1
  shl ax, 1         ;ax 左移1位
  add al, dl        ;(al)+(dl)
  inc bx            ;bx指向下一个字符
  loop r0           ;循环处理输入的2进制字符串
  mov n, ax         ;将最后结果存入n中
  ret
readBin endp

outHex proc near
  mov ah,9         ;显示
  lea dx, msg1     ;字符串
  int 21h          ;msg1

  mov ch, 4        ;一个字,有4个字符,所以需要处理4次
  mov cl, 4        ;每一次,移位的数量为4个bit
  mov bx, n        ;读取n到(bx)中
  mov ah,0eh       ;为调用int 10h,输出(al)中的字符做准备
O0:
  rol bx, cl       ;bx循环左移4位,第1次时,即最高4位->最低4位
  mov al, bl       ;(al)<-(bl)
  and al, 0FH      ;(al)中数据只保留低4位

  cmp al, 10       ;(al)<=9?,则+30H转为数字对应的ASCII字符
  jb O1            ;(al)>9,则为16进制的A-F
  add al, 7        ;        所以要加上7,转为对应的ASCII字符
O1:
  add al, 30h      ;统一+30H
  int 10h          ;调用10h中断,输出到屏幕上
  dec ch           ;ch--
  jnz O0           ;

  ret
outHex endp

cseg ends
end start

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-12-18
转化1个数为R进制字符串。
字符串表示,采用除r取余法,重复的计算n % r的余数和n/r的商,依次得到R进制的各个字符,值得注意的是,得到的R进制的各个字符顺序是从低位到高位,这和我们平时书写的顺序是相反的,为了和书写顺序保持一致,在最后阶段需要将字符串首尾交换。
步骤1: 将缓冲区首地址p和head
步骤2:
c取n除以r的余数,即c=n % r
将c存入p处
p前进一个位置, 即p=p+1;
n取n除以r的商, 即n=n/r;
步骤3: 如果n大于0,继续重复执行步骤2
步骤4:
将字符串倒置,即末字符和第1个字符交换,倒数第2个字符和第2个字符交换,依次类推。本回答被网友采纳
相似回答