注册 登录
编程论坛 汇编论坛

小白,请教汇编:从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数。

阿凡的夏天 发布于 2020-05-03 15:20, 4940 次点击
DATAS SEGMENT
    ;此处输入数据段代码   
DATAS ENDS
 
STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS
 
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
     
    mov bx,0
    mov ch,4
    mov cl,4
 S: mov ah,01h   ;键盘输入,带回显
    int 21h
    cmp al,39h
    jbe next    ;<=
    sub al,07h  ;>
     
next:sub al,30h
     shl bx,cl   ;逻辑左移
     add bl,al
     dec ch
     jnz s      ;不等于
     mov cx,16
  s1:mov dl,0
     rol bx,1   ;循环左移
     adc dl,30h
      
     mov ah,02h ;显示一个字符
     int 21h
     loop s1
     
 
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
 
网上看到的一道题,不太理解其中指令的意思,请多指教
7 回复
#2
Valenciax2020-05-03 15:48
那一句不理解
#3
阿凡的夏天2020-05-03 17:16
回复 2楼 Valenciax
不会的有点多,,自己也看了好长时间,
1.mov cl,     cl是做什么的
2.sub al,07h  大于为什么要减去7
3.add bl,al   什么意思
4.mov cx,16   什么含意
5. rol bx,1   
   adc dl,30h


#4
阿凡的夏天2020-05-03 17:27
回复 2楼 Valenciax
对了,我还感觉这段代码不太正确,不能达到 从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数的效果
#5
Valenciax2020-05-03 18:03
程式大致上正确的,但没有考虑到容错,比如用户输入16进制之外的字符比如AS$H之类...
不喜欢这种写法.
这里我随便就题目写了另一种方式,而输出是用原代码的,你可以编译一下试试效果,随便乱搞一些字符看看它如何处理.
附有解释,看看能不能理解

程序代码:

DATA SEGMENT

 HexTable  db '0123456789ABCDEF';16进制字符表1,数字符和大写
HexTable1 db 'abcdef'        ;16进制字符表2,小写
Len    equ $ - offset HexTable    ;16进制表1&2的总长
DATA ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
    MOV ES,AX        ;ES取值,用以操作scasb
    mov bl,4        ;输入4次初始化
    mov si,0        ;用以保存输入,初始化
    cld            ;清除方向标志,正向
next:
    mov ah,07h        ;输入函数,不显示
    int 21h            ;dos调用,al=输入字符
    mov cx,Len        ;总长
    lea di,HexTable        ;指向16进制字符表
    repnz scasb        ;以al扫瞄es:di cx次,每扫一次,di+1,cx-1
                ;直至找到字符或扫完则停
    jnz next        ;输入字符不在表中,重新输入
    cmp di,offset HexTable1 ;di地址和'小写表地址'比较
    jbe @f            ;di在表1则跳
    sub di,6        ;减去表2和表1的差距
@@:    sub di,offset HexTable+1;再减16进制字符表1,'+1'是调整找到字符时di加多了1
    mov cl,4        ;初始化
    shl si,cl        ;将上次输入移左4位,若第1次输入F,其结果是0000 or 000F = 000F
    or si,di        ;若第2次输入B,其结果是00F0 or 000B = 00FB
                ;若第3次输入4,其结果是0FB0 or 0004 = 0FB4,余类推
    mov dl,al        ;DL=输入字符
    mov ah,2   
     int 21h            ;输出
    dec bl            ;减1
    jnz next        ;未完则再来
    mov dl,0dh        ;以下输出回车0D0AH
    mov ah,2
     int 21h
    mov dl,0ah
    int 21h
    ;
    mov cx,16        ;初始化
@@:    mov dl,0        ;初始化
    rol si,1           ;左旋,最左BIT旋入CF,CF=1或0
    adc dl,30h        ;带进位(CF)加DL,则若CF=1,则DL='1',否则DL='0'
    mov ah,02h        
    int 21h            ;输出
    loop @b            ;回圈

    MOV AH,4CH
    INT 21H
CODES ENDS
    END START




[此贴子已经被作者于2020-5-3 20:46编辑过]

#6
阿凡的夏天2020-05-03 20:07
回复 5楼 Valenciax
非常感谢您的解答,一看您写的代码,就知道是行家,
我其实才刚刚入门,之前并没有学过汇编,因为现在在学微机原理;
接触到了汇编程序,这才开始接触汇编,还是要谢谢您的耐心解答
#7
晴天天2024-06-13 20:46
这个在TEC上怎么写,这个放在TEC上开头不对
#8
晴天天2024-06-13 20:49
从键盘输入一个4位16进制数到寄存器中,把它以二进制代码形式显示到屏幕上。可考虑加上相应的检错功能,参考流程图如下。
只有本站会员才能查看附件,请 登录
这个在TEC上怎么写?
1