例1:二进制数的输入

  • 因为二进制数只有0或者1,如果输入的是其它的就跳转ERROR
  • 如果输入的是回车,就证明输入完成了
  • 如果输入的是1或者0 执行核心代码
  • BX左移一位,把AL的最低位给BL的最低位


@BEGIN:
	XOR	BX,BX	;异或指令对本身运算就是清空BX寄存器,相当于给BX初始化为0

	MOV	AH,1
	INT	21H	;键盘输入并回显
@WHILE:
	CMP	AL,0DH	;判断输入的是否是回车
	JE	@END_WHILE	;如果是回车就跳转END_WHILE

	CMP	AL,'0'
	JE	@BINARY
	CMP	AL,'1'
	JE	@BINARY
;如果用户输入的是0或者1就跳转BINARY
;如果不是的话,就会执行下面这句直接跳转到ERROR
	JMP	@ERROR

@BINARY:	;用户输入的是0或者1的情况,也就是二进制数的情况
	AND	AL,0FH	;取AL的低四位
	SHL	BX,1	;把BX向左移一位
	OR	BL,AL	;把AL的最低位给BL的最低位

	INT	21H	;键盘输入并回显
	JMP	@WHILE	;继续循环判断
@END_WHILE:
	JMP	@EXIT	;执行EXIT
@ERROR:
	MOV	AH,2
	MOV	DL,0DH
	INT	21H
	MOV	DL,0AH	
	INT	21H	;输出回车

	JMP	@BEGIN	;从头来
@EXIT:

理解这段代码首先需要了解,


AX寄存器是由AH和AL组成的
AH是高8位寄存器(H代表高),AL是低8位寄存器(L代表低)
(BX同理)

假设 用户输入1以后,AL的值就是0011 0001

AND	AL,0FH

这句代码的含义是 将AL的高四位清零

0FH0000 1111B使用AND指令就能实现高位清零

此时AL变成0000 0001

SHL	BX,1

第一次执行SHL BX,1的时候没有用
但是从第二次循环开始。每次BX的位会左移一位(注意不是BL,而是BX这个整体)

OR	BL,AL

OR指令(相对应的位只要有一个是1,那么运算结果就是1,其余情况就是0)

由于在这个程序里面是二进制输入,所以只有0和1这两种情况
那么AND AL,0FH以后 AL就只有0000 0001(1的情况)或者 0000 0000(0的情况)
所以执行OR指令相当于是把AL的最低位给了BL的最低位

那么下次循环的时候,会将整个BX的每个位左移,之前存放在BL最低位的数字也会左移一格。就好像你写字的手,手不东,纸在动

以此来存储完全部的二进制数




例2:二进制数的输出

  • 用ROL将最高位移入CF
  • 判断CF是否等于1,等于输出1,不等于1输出0

	MOV	AH,2
	MOV	CX,16
@OUTPUT:
	ROL	BX,1	;会将最高位移入CF
	JC	@HIGH	;JC用于判断CF是否等于1,等于1跳转HIGH

	MOV	DL,30H	;如果是0的话就给DL存储30H也就是0
	JMP	@NEXT	
@HIGH:
	MOV	DL,31H	;如果是1的话,DL存储31H也就是1
@NEXT:
	INT	21H	;输出
	LOOP	@OUTPUT	;循环

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏