1.and指令
mov al,00001111B
and al,00111100B
那么
al=00001100B
也就是 与&
2.or指令
同理
mov al,00001111B
or al,00000000B
那么
al=00001111B
也就是 或|
3.设置al的第0位为0
那么可以这样
and al, 11111110B
第1位为0
and al, 11111101B
第2位为0
and al, 11111011B
4.ASCII
0011 0000 48 0x30 0 字符0
0011 0001 49 0x31 1 字符1
0011 0010 50 0x32 2 字符2
0011 0011 51 0x33 3 字符3
0011 0100 52 0x34 4 字符4
0011 0101 53 0x35 5 字符5
0011 0110 54 0x36 6 字符6
0011 0111 55 0x37 7 字符7
0011 1000 56 0x38 8 字符8
0011 1001 57 0x39 9 字符9
0100 0001 65 0x41 A 大写字母A
0100 0010 66 0x42 B 大写字母B
0100 0011 67 0x43 C 大写字母C
0100 0100 68 0x44 D 大写字母D
0100 0101 69 0x45 E 大写字母E
0100 0110 70 0x46 F 大写字母F
0100 0111 71 0x47 G 大写字母G
0100 1000 72 0x48 H 大写字母H
0100 1001 73 0x49 I 大写字母I
0100 1010 74 0x4A J 大写字母J
0100 1011 75 0x4B K 大写字母K
0100 1100 76 0x4C L 大写字母L
0100 1101 77 0x4D M 大写字母M
0100 1110 78 0x4E N 大写字母N
0100 1111 79 0x4F O 大写字母O
0101 0000 80 0x50 P 大写字母P
0101 0001 81 0x51 Q 大写字母Q
0101 0010 82 0x52 R 大写字母R
0101 0011 83 0x53 S 大写字母S
0101 0100 84 0x54 T 大写字母T
0101 0101 85 0x55 U 大写字母U
0101 0110 86 0x56 V 大写字母V
0101 0111 87 0x57 W 大写字母W
0101 1000 88 0x58 X 大写字母X
0101 1001 89 0x59 Y 大写字母Y
0101 1010 90 0x5A Z 大写字母Z
0101 1011 91 0x5B [ 开方括号
0101 1100 92 0x5C \ 反斜杠
0101 1101 93 0x5D ] 闭方括号
0101 1110 94 0x5E ^ 脱字符
0101 1111 95 0x5F _ 下划线
0110 0000 96 0x60 ` 开单引号
0110 0001 97 0x61 a 小写字母a
0110 0010 98 0x62 b 小写字母b
0110 0011 99 0x63 c 小写字母c
0110 0100 100 0x64 d 小写字母d
0110 0101 101 0x65 e 小写字母e
0110 0110 102 0x66 f 小写字母f
0110 0111 103 0x67 g 小写字母g
0110 1000 104 0x68 h 小写字母h
0110 1001 105 0x69 i 小写字母i
0110 1010 106 0x6A j 小写字母j
0110 1011 107 0x6B k 小写字母k
0110 1100 108 0x6C l 小写字母l
0110 1101 109 0x6D m 小写字母m
0110 1110 110 0x6E n 小写字母n
0110 1111 111 0x6F o 小写字母o
0111 0000 112 0x70 p 小写字母p
0111 0001 113 0x71 q 小写字母q
0111 0010 114 0x72 r 小写字母r
0111 0011 115 0x73 s 小写字母s
0111 0100 116 0x74 t 小写字母t
0111 0101 117 0x75 u 小写字母u
0111 0110 118 0x76 v 小写字母v
0111 0111 119 0x77 w 小写字母w
0111 1000 120 0x78 x 小写字母x
0111 1001 121 0x79 y 小写字母y
0111 1010 122 0x7A z 小写字母z
5.ASCII主要
十进制 十六 字母
48 0x30 0
57 0x39 9
65 0x41 A
90 0x5A Z
97 0x61 a
122 0x7A z
6.示例
assume ds:data
data segment
db 'apple'
data ends
code segment
start:
mov al,'a'
mov bl,'b'
mov ax,4c00H
int 21H
code ends
end start
7.ASCII重要
48 0x30 0
65 0x41 A
97 0x61 a
9就是57,39H
Z就是90,5AH
z就是122,7AH
8.大小写转换
大写转小写就是 +20H
小写转大写就是 -20H
9.大小写转换
如果看字母的二进制的话我们发现
大写和小写的二进制其实除了第5位,都是一样的,大写的是为0,小写的是1
比如
A 0100 0001
B 0100 0010
C 0100 0011
D 0100 0100
---
a 0110 0001
b 0110 0010
c 0110 0011
d 0110 0100
我们发现,只有第5位不同,其他都一样
所以如果是
大写转小写,第5位的0变成1
小写转大写,第5位的1变成0
OK,示例
mov al,0100 0001H (al是A)
or al,0010 0000H
or了之后,al变成了0110 0001H
也就是a
示例2
mov al,0110 0001H (al是a)
and al,1101 1111H
and了之后,al变成0100 0001H
也就是A
10.SI和DI
SI和DI是8086的两个与bx功能相似的寄存器,但是SI和DI不能分成2个8位寄存器来使用
示例
1.
mov bx,0
mov ax,[bx]
2.
mov si,0
mov ax,[si]
3.
mov di,0
mov ax,[di]
11.示例
1.
mov bx,0
mov ax,[bx+10]
2.
mov si,0
mov ax,[si+10]
3.
mov di,0
mov ax,[di+10]
13.问题: 字符串复制
assume cs:code,ds:data
data segment
db 'hello world'
db '...'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov di,11
mov cx,5
s:
mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax 4c00H
int 21H
code ends
end start
14.方法精简
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov cx,8
s:
mov ax,0[si]
mov 16[si],ax
add si,2
loop s
mov ax,4c00H
int 21H
code ends
end start
15.案例
将data中的每个单词的头字母改成大写
assume cs:code,ds:data
data segment
db '1.file '
db '2.edit '
db '3.search'
data ends
code segment
start:
...
code ends
end start
代码
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,6
s:
mov al,[bx+2]
and al,1101 1111H
mov [bx+3], al
add bx,16
loop s
mov ax,4c00H
int 21H
16.案例
将data段中的每个单词改为大写
assume cs:code,ds:data
data segment
db 'apple'
db 'apple'
db 'apple'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,3
s0:
mov si,0
mov cx,3
s:
mov al,[bx+si]
and al,1101 111B
mov [bx,si],al
inc si
loop s
add bx,16
loop s0
mov ax,4c00H
int 21H
code ends
end start
(以上代码有误)
下面修改
17.
assume cs:code,ds:data
data segment
db 'apple'
db 'apple'
db 'apple'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,3
s0:
mov dx,cx
mov si,0
mov cx,3
s:
mov al,[bx+si]
and al,1101 111B
mov [bx,si],al
inc si
loop s
add bx,16
mov cx,dx
loop s0
mov ax,4c00H
int 21H
code ends
end start
18.改进方案,使用内存
看看改进的程序
code segment
start:
mov ax,data
mov ds,ax
mov bx,0
mov cx,3
s0:
mov ds:[40H],cx
mov si,0
mov cx,3
s:
mov al,[bx,si]
and al,1101 1111B
mov [bx+si],al
inc si
loop s
mov ax,004cH
int 21H
19.用栈来改进
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov bx,0
mov cx,3
s0:
push cx
mov si,0
mov cx,3
s:
mov al,[bx+si]
and al,1101 1111B
mov [bx+si],al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00H
int 21H
code ends
20.案例
将data中每个单词的前4个字母改成大写字母