标题:小白,请教汇编:从键盘接收一个四位的16进制数,并在终端上显示与它等值的 ...
只看楼主
阿凡的夏天
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2020-4-9
结帖率:100%
已结贴  问题点数:10 回复次数:5 
小白,请教汇编:从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数。
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
 
网上看到的一道题,不太理解其中指令的意思,请多指教
搜索更多相关主题的帖子: 输入 MOV 显示 代码 键盘 
2020-05-03 15:20
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:10 
那一句不理解
2020-05-03 15:48
阿凡的夏天
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2020-4-9
得分:0 
回复 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


2020-05-03 17:16
阿凡的夏天
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2020-4-9
得分:0 
回复 2楼 Valenciax
对了,我还感觉这段代码不太正确,不能达到 从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数的效果
2020-05-03 17:27
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册:2016-5-15
得分:0 
程式大致上正确的,但没有考虑到容错,比如用户输入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编辑过]

2020-05-03 18:03
阿凡的夏天
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2020-4-9
得分:0 
回复 5楼 Valenciax
非常感谢您的解答,一看您写的代码,就知道是行家,
我其实才刚刚入门,之前并没有学过汇编,因为现在在学微机原理;
接触到了汇编程序,这才开始接触汇编,还是要谢谢您的耐心解答
2020-05-03 20:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-501399-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029659 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved