例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的高四位清零
0FH是0000 1111B使用AND指令就能实现高位清零
此时AL变成0000 0001
SHL BX,1第一次执行SHL BX,1的时候没有用
但是从第二次循环开始。每次BX的位会左移一位(注意不是BL,而是BX这个整体)
OR BL,ALOR指令(相对应的位只要有一个是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 ;循环