编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数和十进制数
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
汇编语言,键盘任意输入10个1位十进制数,将它们累加求和,把和放在Sum...
汇编语言编程中,处理键盘输入和数值处理是一个常见的任务。假设我们需要编写一段程序,能够接收用户通过键盘输入的10个1位十进制数,并将这些数累加求和。程序将把结果存储在一个名为Sum的单元中,并以十进制形式显示。下面是一个简单的汇编语言示例,展示如何实现这一功能。首先,程序需要初始化环境,...
用汇编语言编写七段数码管显示1~9,用8255A接口芯片,用中断方式...
在进行实验时,我们使用了汇编语言编写了一段程序,用于在七段数码管上显示1至9的数字。程序中,我们将数据段中的端口地址进行了调整,以匹配计算机中8255A接口芯片的端口地址。从键盘接收数字后,程序会将其转换为相应的段码,并在数码管上进行显示。首先,程序定义了数据段,并将端口地址进行了相应的...
写一个程序,它先接收一个字符串,然后显示其中数字符的个数、英文字母...
;从键盘输入一行字符,统计字母、空格、数字、其他字符的个数,并显示 ;用80x86汇编语言编程如下:;--- DATA SEGMENT PARS DB 100 ;准备接收100个字符.NNN DB ? ;用于存放实际输入的个数.III DB 100 DUP(?) ;100字节的空间.N_N DB ?S_N DB ?C_N DB ?O_N...
编写一个汇编程序,从键盘接收一位十进制n.然后在屏幕上显示n个星号 急...
每当系统中产生特定的消息时,钩子就能在第一时间钩住(截获)它,也就是说钩子过程优先得到消息的控制权。这时钩子过程即可以加工、处理该消息,又可以不作任何改变而继续传递该消息,还可以强制结束这个消息的传递。
求一段8086汇编语言程序设计,将键盘接收到的四位十六进制数转换为等值的...
十六进制ABCD = 二进制A<<12d+B<<8d+C<<4d+D
微机原理与汇编语言 题目:用跳转语句实现从键盘接收一个字符,如果是小...
code segment assume cs:code org 100hstart:jmp beginmsg db 13,10,13,10,'PLEASE INPUT:$'char1 db ?m dw 0big db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'bign equ $-bigloww db 'abcdefghijklmnopqrstuvwxyz'lown equ $-lowwdig db '0123456789'dign equ $-digbegin:...
试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来...
cmp al,61h ;判断是不是小写字母 jb s2 cmp al,7ah ja s2 sub al,20h ;如果是减20H变成大写并输出 如果不是直接输出不减20H s2:mov dl,al ;输出AL mov ah,2 int 21h jmp s1 s3:mov ah,4ch int 21h 没调试写一下大概思路。
接收键盘字符,(以回车键结束),并将其中的小写字母转变为大写字母,然 ...
接收键盘字符,(以回车键结束),并将其中的小写字母转变为大写字母,然后显示在屏幕上,请用汇编实现。试试下面的:DATA SEGMENT MSG1 DB 13, 10, 'Please input a STR : $'MSG2 DB 13, 10, 'The STR in Upper is: $'I1_L DB 100 I1_N DB ?I1_B DB 100 ...
用汇编语言编写七段数码管显示1~9,用8255A接口芯片,用中断方式...
你知道的,把数据段中的端口地址改为你的计算机可识别的8255A的端口地址 ;从键盘接收数字,在七段数码管上显示 data segment ioport equ 2400h-0280h io8255a equ ioport+288h io8255b equ ioport+28bh led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh mesg1 db 0dh,...
用8086汇编语言编写程序,从键盘输入一段字符,以#结束,统计其中数字,字母...
为了简便,直接使用了21中断的输入字符串子功能,即使你不输入#作为结束符,也可以使用。统计时,则将'#'后面的字符忽略正确的作法,是调用21中断的1号子功能,每次读取一个字符,直到读取到'#'为止。这个修改很简单,我就不再写了。data segment buf db 255 ; db ? db 255 dup('$') ...