例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,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 ;循环