第七章 更灵活的定位内存地址的方法
and和or命令
and指令,逻辑与运算
mov al,01100011B
and al,00111011B
执行后:al = 00100011B
通过and指令可以设相应位为0:
将al的第6位设0:and al,10111111B
将al的第7位设0:and al,01111111B
将al的第0位设0:and al,11111110B
or指令,逻辑或运算
mov al,01100011B
or al,00111011B
执行后:al=01111011B
通过or指令可以设相应位为1:
将al的第6位设0:or al,01000000B
将al的第7位设0:or al,10000000B
将al的第0位设0:or al,00000001B
大小写的转换
通过ASCII码的二进制对比:
大写 | 十六进制 | 二进制 | 小写 | 十六进制 | 二进制 |
A | 41 | 01000001 | a | 61 | 01100001 |
B | 42 | 01000010 | b | 62 | 01100010 |
C | 43 | 01000011 | c | 63 | 01100011 |
D | 44 | 01000100 | d | 64 | 01100100 |
E | 45 | 01000101 | e | 65 | 01100101 |
大写与小写相差32(十进制)二进制第5位为0是大写,为1是小写。
将datasg中的第一个字符串转化为大写,第二个字符串转换为小写。利用and or 命令进行大小写的转换:
DATAS SEGMENT
DB 'BaSic'
DB 'iNFOrMaTiOn'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV BX,0
MOV CX,5
S: MOV AX,[BX]
AND AL,11011111B
MOV [BX],AL
INC BX
LOOP S
MOV BX,5
MOV CX,11
S1: MOV AX,[BX]
OR AL,00100000B
MOV [BX],AL
INC BX
LOOP S1
MOV AH,4CH
INT 21H
CODES ENDS
END START
SI和DI
si和di在8086CPU中功能和bx寄存器相近。si和di不能分为两个8字节的寄存器使用。
不同的寻址方式的灵活应用
[data]用一个常数表示地址
[bx]用一个变量表示内存地址
[bx+data]或data[bx]或[bx].data用一个变量和常量表示地址,一个基础地址上用变量间接定位一个内存单元
[bx+si]用两个变量表示地址
[bx+di+data]两个变量和一个常量表示地址