0%

第七章 更灵活的定位内存地址的方法

and和or指令

“与”运算指令AND

格式:AND OP1,OP2
功能:对OP1、OP2按位相“与”
说明:常用于使指定位数置0的操作中。

1
2
MOV   AL,63H       ;输入0110 0011
AND AL,0FH ;使AL高四位为0,低四位不变

逻辑“或”指令OR

格式:OR OP1,OP2
功能:对OP1、OP2按位相“或”。
说明:通常用于使指定位数置1的操作。

举例:使AL中的最低两位置1。

1
OR   AL,03H       

ASCII码

在ASCII编码中,将常用的128个字符用八位二进制数(00000000—01111111)表示,其中最高一位为0。

符号 十进制范围
0~9 48~57
A~Z 65~90
a~z 97~122

以字符形式给出的数据

用一对单引号‘….’括起的内容作为字符处理

1
2
3
4
data segment
db ‘unIX’ ;Db 75h,6eh,49h,58h
db ‘foRK’ ;Db 66h,6fh,52h,4bh
data ends
1
mov  bl,’b’     ;Mov bl, 62h

大小写转换问题

补全程序,将DATA中的第一个字符串转化为大写,将第二个字符串转化为小写

1
2
3
4
5
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DB ‘BaSiC’
DB ‘iNfOrMaTiOn’
DATA ENDS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Start:    
mov ax,data
mov ds,ax
mov bx,0
mov cx,5
S1:
mov al,[bx]
and al,0dfh
mov [bx],al
inc bx
loop s1
mov bx,5
mov cx,11
S2:
mov al,[bx]
or al,20h
mov [bx],al
inc bx
loop s2
mov ax,4c00h
int 21h

转换为大写可以and 0dfh,转换成小写or 20h

[bx+idata]

MOV AX,[BX]
MOV AX,[BX+200]

用[bx+idata]方式处理数组

补全程序,将DATA中的第一个字符串转化为大写,将第二个字符串转化为小写。

1
2
3
4
5
ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DB ‘BaSiC’
DB ‘MinIX’
DATA ENDS
1
2
3
4
5
6
7
8
9
10
11
12
13
Start:    mov  ax,data
mov ds,ax
mov bx,0
mov cx,5
S1:
mov al,[bx]
and al,0dfh
mov [bx],al
mov al,[bx+5]
or al,20h
mov [bx+5],al
inc bx
loop s1

SI和DI

SI:源变址寄存器
DI:目的变址寄存器
SI和DI只能用作16位寄存器,常用于对内存单元的寻址,功能与BX寄存器相近。

用寄存器SI和DI实现字符串‘welcome to masm!’复制到它后面的数据区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
assume cs:code,ds:data
data segment
db ‘welcome to masm!’
db ‘…………….’
data ends
code segment
start:
Start:
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
S:
mov ax,[si]
mov [di],ax
add si,2
add di,2
loop s
mov ax,4c00h
int 21h
code ends
end start

[bx+si]和[bx+di]

MOV AX,[BX+SI]
MOV AX,[BX][DI]

[bx+si+idata]和[bx+di+idata]

MOV AX,[BX+SI+100]
MOV AX,[BX+DI+100]
MOV AX,[BX+100+SI]
MOV AX,[BX+100+DI]