dos汇编练习(1):键盘输入十六进制,并显示二进制结果

第一次练习,先再熟悉一遍8086汇编时的代码通用框架:

data segment ;定义数据段,名称随意
	;放数据
data ends ;结束句必须要有
code segment ;定义代码段,名称随意 code ends在程序最后
assume cs:code,ds:data ;声明代码段,数据段
Start:    ;定义开头标号,名称随意
		MOV AX,DATA ;接下来的这两句必须要有
		MOV DS,AX  ;把data(数据) 转到 DS 数据段寄存器,让数据段指向正确的位置。
		;接下来这里可以填写你的程序

code ends
	end Start

1> 要完成键盘输入和显示的功能,需要借助 int 21h DOS的中断调用:MOV AH, 01HMOV AH, 02H
常用DOS(INT 21H)功能调用表

2> 先写一段输入0~9并显示二进制结果的程序:

code segment
	assume cs:code
start:  mov cx,4
	xor bx,bx ;bx清0
input:
	mov ah,01h ;dos中断输入功能,输入到al,al中实际存的是ASCII码
			;的16进制表示形式,最底层实际存的是二进制形式
	int 21h
	cmp al,'0' ;若输入0~9以外的字符则跳转到error
	jb error    ;无符号小于则跳转
	cmp al,'9'
	sub al,30h ;减30h,取出其对应的十进制值,al中现在存的是0~9
	jmp ok

error:
	jmp input ;死循环重新输入

ok:
	rol bx,1 ;循环移位, 输入0001
	rol bx,1 ;循环移位, 输入0012
	rol bx,1 ;循环移位, 输入0123
	rol bx,1 ;循环移位, 输入1234
	or bl,al  ;每移位一次后,或上输入的数,存入al
	loop input
	mov cx,16

disp:	;此段用于显示逗号来空格
	cmp cx,16 ;共16位二进制数比较16次
	jz next ;跳过第一个逗号
	test cx,03h ;01h每隔两个字符显示一个逗号,以此类推
	jnz next
	mov dl,','
	mov ah,02h ;显示逗号
	int 21h

next:	rol bx,1 ;循环移位, bx变为2341
	mov dl,bl 
	and dl,01h   ; 相与后取最低位
	or dl,30h      ; dl实际底层已自动将0~9存成二进制,用或运算加上30h
				   ;正好变为二进制0和1对应的ASCII码
	mov ah,02h  ;显示结果
	int 21h
	loop disp

	mov ah,4ch
	int 21h
code ends
	end start

改进成0~F的:
将显示字符和回车换行的功能,写成宏定义后,可直接调用。

dispchar macro x,y
	mov cx,y
dispx:
	mov dl,x
	mov ah,02h
	int 21h
	loop dispx
	endm

huiche macro
	mov ah,02h
	mov dl,0dh
	int 21h
	mov ah,02h
	mov dl,0ah
	int 21h
	endm

code segment
	assume cs:code
start:  mov cx,4
	xor bx,bx
input:
	mov ah,01h
	int 21h

	cmp al,'0'
	jb error
	cmp al,'9'
	ja daxie
	sub al,30h
	jmp ok

daxie:
	cmp al,'A'
	Jb error
	cmp al,'f'
	ja error
	sub al,57h
	jmp ok

error:
	jmp input

ok:
	rol bx,1
	rol bx,1
	rol bx,1
	rol bx,1
	or bl,al
	loop input
	huiche
	mov cx,16

disp:	cmp cx,16
	jz next
	test cx,03h
	jnz next
	mov dl,','
	mov ah,02h
	int 21h

next:	rol bx,1
	mov dl,bl
	and dl,01h
	or dl,30h
	mov ah,02h
	int 21h
	loop disp

	mov ah,4ch
	int 21h
code ends
	end start

在这里插入图片描述
例:键盘输入4位压缩BCD码,并存入BX中。

DATA SEGMENT
MSG DB "PLEASE INPUT 4 NUMBERS:",0DH,0AH,"$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
        MOV  AX,DATA
        MOV  DS,AX
        MOV  AH,09H
        LEA  DX,MSG
        INT  21H
        MOV  CX,4
        XOR  BX,BX
INPUT:
        MOV  AH,01H
        INT  21H
        CMP  AL,'0'
		JAE  NEXT
        JMP  INPUT
NEXT:
        CMP  AL,'9'
        JBE  OK
		JMP  INPUT
OK:
        SUB  AL,30H
OK2:
        SHL  BX,1
        SHL  BX,1
        SHL  BX,1
        SHL  BX,1
        OR   BL,AL
        LOOP INPUT
        MOV  AH,4CH
        INT  21H
CODE ENDS
     END  START

用P命令追踪查看运行过程:
在这里插入图片描述
逐次输入2234H后,最终存入BX寄存器中。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayne_Fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值