编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数和十进制数

作者&投稿:鬱文 (若有异议请与网页底部的电邮联系)
试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上显示与它等值的二进制数。~

code segment
assume cs:code

start: mov bx,0
mov ch,4

mov cl,4

s0: mov ah,1 ;键盘输入4个16进制数

int 21h

cmp al,39h ;判断是0~9还是A~H,若是数字减30H,否则还要减07H

jbe next

sub al,07h

next: sub al,30h
shl bx,cl
add bl,al ;转换后的数据存入BX,每存一次左移4位
dec ch

jnz s0 ;输入完则控制显示

mov cx,16

s1: mov dl,0

rol bx,1 ;循环左移1位,最高位移入CF

adc dl,30h ;加30H后可得该位的ASCII码.

mov ah,02h

int 21h

loop s1

mov ax,4c00h

int 21h

code ends
end start

说明:编译连接后,运行后直接输入4个16进制数后回车即可.

BEGIN: MOV BX, 0 ;用于存放四位的16进制数
MOV CH, 4
MOV CL, 4
INPUT: SHL BX, CL ;将前面输入的数左移4位
MOV AH, 1 ;从键盘取数
INT 21H
CMP AL, 30H ;<0吗?
JB INPUT ;不是‘0~F’的数重新输入
CMP AL, 39H ;是‘0~9’吗?
JA AF ;不是,转‘A~F’的处理
AND AL, 0FH ;转换为:0000B~1001B
JMP BINARY
AF: AND AL, 1101 1111B ;转换为大写字母
CMP AL, 41H ;又<A吗?
JB INPUT ;不是‘A~F’的数重新输入
CMP AL, 46H ;>F吗?
JA INPUT ;不是‘A~F’的数重新输入
AND AL, 0FH ;转换为:1010B~1111B
ADD AL, 9
BINARY: OR BL, AL ;将键盘输入的数进行组合
DEL CH
JNZ INPUT
DISPN: MOV CX, 16 ;将16位二进制数一位位地转换成ASCII码显示
DISP: MOV DL, 0
ROL BX, 1
RCL DL, 1
OR DL, 30H
MOV AH, 2 ;进行显示
INT 21H
LOOP DISP
STOP: RET

参考:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/a5fcfaf6a09cd93e730eeca8.html

;从键盘输入四位16进制数,以2进制、10进制输出
;=============================================
DATA SEGMENT

STR1 DB 'INPUT A HEX NUM: $'
HEX DB 5 ;计划输入的字符个数(含回车符)
NNN DB 0 ;存放实际输入的字符个数
DB 5 DUP(?)
BIN DW ? ;输入数字的二进制形式的存放单元
ERR DB 0AH, 0DH, ' ERROR !'
DB 0AH, 0DH, ' I HAVE NO TIME TO PLAY WITH YOU ! $'
STR2 DB 13, 10, 'BINARY IS: $'
DATA ENDS
;--------------------------------------------
STACK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
STACK ENDS
;--------------------------------------------
CODE SEGMENT
ASSUME CS:CODE, SS:STACK, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX

LEA DX, STR1 ;'INPUT A HEX NUM'
MOV AH, 9 ;显示字符串
INT 21H

LEA DX, HEX
MOV AH, 10 ;等着输入四位HEX数
INT 21H
;---------------------------------------
;下面进行转换

MOV BIN, 0 ;先把二进制数字单元清零

LEA SI, HEX + 2;取输入字符串的首地址
MOV CH, NNN ;取输入字符的个数,用来控制循环处理的次数

CONV:
MOV BL, [SI] ;取来一个字符
CMP BL, 0DH ;和回车符进行比较
JZ END0 ;是, 即结束

CMP BL, '0'
JB ERROR ;小于'0'转移
CMP BL, 'F'
JA ERROR ;大于'F'转移

CMP BL, '9'
JNA A2B ;不大于'9', 就去变换
CMP BL, 'A'
JNB A2B ;不小于'A', 就去变换

JMP ERROR ;其它符号都是错误
;---------------------------------------
A2B:
SUB BL, 30H ;ASC-->BIN
CMP BL, 10
JB A2B_END
SUB BL, 07H ;ASC-->BIN
A2B_END:
;---------------------------------------
MOV BH, 0 ;弄成16位数

PUSH CX

MOV AX, BIN ;把原来的数字乘以16
MOV CX, 16
MUL CX
ADD AX, BX ;加上新输入的
MOV BIN, AX ;存结果,这就是二进制数

INC SI

POP CX
DEC CH ;处理次数减一
JNZ CONV ;非零转移
;---------------------------------------
DISP:
LEA DX, STR2 ;'BINARY IS: $'
MOV AH, 9 ;显示字符串
INT 21H
;---------------------------------------
MOV AX, BIN ;取来数字
MOV CX, 16 ;显示16位数
DDDD:
MOV DL, '0' ;先计划显示0
TEST AX, 8000H ;测试最高位
JZ DDD1
INC DL ;非0就显示1
DDD1:
PUSH AX
MOV AH, 2 ;显示DL中的ASCII码
INT 21H
POP AX

SHL AX, 1 ;左移
LOOP DDDD ;CX-1,非零转移

JMP END0 ;16位显示完毕,转到结束
;---------------------------------------
ERROR:
LEA DX, ERR
MOV AH, 09H ;错误信息提示
INT 21H
;---------------------------------------
END0:
MOV DL, 10
MOV AH, 2 ;显示DL中的ASCII码
INT 21H

MOV DL, 13
MOV AH, 2 ;显示DL中的ASCII码
INT 21H
;---------------------------------------
MOV AX, BIN ;取来数字
CALL DISP_AX

MOV AH, 4CH ;返回DOS
INT 21H
;------------------------------
DISP_AX:
MOV BX, 10 ;10进制.
MOV CX, 5 ;5位.
ABC:
MOV DX, 0
DIV BX
PUSH DX ;保存余数
LOOP ABC
MOV CX, 5 ;显示5位.
ASD:
POP DX
CMP DL, 10
JB A48
ADD DL, 7
A48:
ADD DL, 48
MOV AH, 2
INT 21H ;输出.
LOOP ASD
RET
;------------------------------
CODE ENDS
;---------------------------------------
END START
;=============================================

程序执行效果如下:

c:\masm510>H_BD
INPUT A HEX NUM: D4A2
BINARY IS: 1101010010100010
54434
c:\masm510>

        CODE  SEGMENT
              ASSUME    CS:CODE

      NUMBER  DB        5,?,5 DUP(?)
        LFCR  DB        13,10,'$'

      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              LEA       DX,NUMBER
              MOV       AH,10
              INT       21H
              LEA       DX,LFCR
              MOV       AH,9
              INT       21H
              LEA       SI,NUMBER
              ADD       SI,2
              MOV       BP,0
              MOV       CX,4
              CLD
         @1:
              PUSH      CX
              MOV       CX,4
              ROL       BP,CL
              LODSB
              CALL      ASCII2HEX
              XOR       AH,AH
              ADD       BP,AX
              POP       CX
              LOOP      @1

              MOV       AX,BP
              MOV       BX,10
              CALL      DSPAXX
              MOV       AX,BP
              MOV       BX,2
              CALL      DSPAXX

              MOV       AH,4CH
              INT       21H
;===============================
   ASCII2HEX  PROC      NEAR
              CMP       AL,'0'
              JB        @BYTE9
              CMP       AL,'9'
              JA        @BYTE2
              AND       AL,0FH
              RET
     @BYTE2:
              CMP       AL,'A'
              JB        @BYTE9
              CMP       AL,'F'
              JA        @BYTE4
              SUB       AL,37H
              RET
     @BYTE4:
              CMP       AL,'a'
              JB        @BYTE9
              CMP       AL,'f'
              JA        @BYTE9
              SUB       AL,57H
              RET
     @BYTE9:
              MOV       AL,0        ; 错误的输入当0对待
              RET
   ASCII2HEX  ENDP
 ;================================  
     ; 输出ax的值,输出的进位制在bx中设定,bx=2~16  
      DSPAXX  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSHF
              XOR       CX,CX
              ; MOV       BX,16
  @DSPAXX_1:
              XOR       DX,DX
              DIV       BX
              INC       CX
              OR        DX,30H
              PUSH      DX
              CMP       AX,0
              JNE       @DSPAXX_1
              MOV       AH,2
 @DISPAXX_2:
              POP       DX
              CMP       DL,3AH
              JB        @DISPAXX_3
              ADD       DL,7
 @DISPAXX_3:
              INT       21H
              LOOP      @DISPAXX_2
              MOV       DL,32
              INT       21H
              POPF
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
      DSPAXX  ENDP
;===============================
 
        CODE  ENDS
              END       START


用汇编语言写一个程序,从键盘输入姓名(xiao ming)、学号,倒着输出姓名...
答:2 mov dl,0ah int 21h mov si,offset chartext cld mov ch,0 mov cl,actchar again:lodsb push ax loop again mov ch,0 mov cl,actchar again1:pop dx mov ah,2 int 21h loop again1 code ends end start 输入姓名回车,就能反向输出。差不多是这样,还有问题加我QQ1442521041 ...

汇编语言,编程实现从键盘输入四位十六进制数,使出对应的十进制数,用...
答:10 INT 21H LEA SI,BUFF MOV CL,[SI+1] MOV CH,0 CLD ADD SI,2 MOV DX,0 @1: LODSB CMP AL,'0' JB @0

试编写一个汇编语言程序,从键盘输入一个字符,若该字符是大写字母,在...
答:;小于'a'?JB LB_NO ;--- PRINT MSG_LOWER JMP LB_1 UUU:PRINT MSG_UPPER JMP LB_1 LB_NO:PRINT MSG_NO JMP LB_1 ;--- EXIT:MOV AX, 4C00H INT 21H CSEG ENDS END START 参考资料:楼上的程序

急~~用汇编语言编写出从键盘输入10个字符然后相反的顺序将字符输出_百 ...
答:mov ah,0ah ;从键盘接受一串字符 int 21h CALL Enter_CTLF ;输出一个回车、换行 CALL Enter_CTLF ;输出一个回车、换行 cld lea si,Buffer[1] ;实际输入的字符个数地址 mov cl,[si] ;读入实际输入的字符个数 test cl,0ffh jz Exit_Proc ;直接回车,没有输入任何字符,结束程序,...

试编写一段完整的汇编程序,从键盘输入10个十进制数存入到BUFFER1开始...
答:DATA SEGMENT ARRAY DW 10 DUP(?)MESS DB 'PLEASE INTPUT YOUR NUMBER',0DH,0AH,'$'MESS2 DB ',','$'MESS3 DB 'EEROR',0DH,0AH,'$'MESS4 DB 'H,','$'MESS5 DB 0DH,0AH,'RESULT:',0DH,0AH,'$';LEN EQU 20 LEN2 EQU 10 FLAG DB 1 CHANGE DB 0 DATA ...

用汇编语言编写:从键盘输入一个字母,然后程序使得屏幕再出现该字母之...
答:; 本程序通过编译,运行正确。Code Segment Assume CS:Code,DS:Code KBEsc equ 1BH PromptStr DB 'Please input a letter(Esc to exit): $'Start: push cs pop ds ;使数据段与代码段同段 Begin: lea dx,PromptStr mov ah,9 int 21h mov ah,1 int 21h cmp ...

使用8086汇编语言编写程序 编写程序实现:将从键盘输入的小写字母转换...
答:data ends ;--- code segment assume cs:code,ds:data start :push ds mov ax,0 push ax mov ax,data mov ds,ax lea bx ,chars mov si,0 mov ch,0 ;---输入字符子程序 scanf:mov ah,1 int 21h cmp al,0dh jz crt cmp al,61h jnb L1 ;al>='a'mov [bx],al inc bx inc ...

用8086汇编语言编写程序,接受从键盘上输入的一个两位十进制数字,这个数...
答:2011-05-04 在51单片机中,使用汇编语言,如何将十六进制数转换成十进制。 23 2008-02-25 编写代码用汇编语言将BCD码转化为十六进制数 1 2012-02-29 编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在... 16 2011-11-08 汇编语言题目:将一个数用十进制和十六进制显示 2 2009-01-21 求...

用汇编语言编写完整程序,从键盘读入一个符号串,吧各符号颠倒顺序后放回...
答:outstr <确定请按1,重新输入请按任意键(除1)> mov ah,0h int 16h ;用键盘读入一个字符到al cmp al,'1'je next br outstr<你选择了重新输入,请按提示进行操作> br jmp start ;如果用户输入的为数字1,则继续执行下面的代码,否则重新执行上面的代码 ;下面进行串序颠倒 next: mov di,...

用C语言怎么编写程序实现从键盘输入数值
答:include"stdio.h"//从键盘输入10个数存入一维数组,求这10个数中的最大值和最小值并输出 intmain(){ inti;floatmax,min,num[10];printf("请输入10个数,每输入一个数按回车键结束:\n");for(i=0;i<10;i++){ scanf("%f",&num[i]);} max=min=num[0];for(i=1;i<10;i++){ ...