7.1 and 和 or 指令
and 按位逻辑与,or 按位逻辑或
mov al, 0110_0011b
and al, 0011_1011b
;执行后 al= 0010_0011b
or al, 0011_1011b
;执行后 al= 0111_1011b
7.2 关于ASCII码
是一种编码方案,约定了用什么信息来表示现实对象。
用61H表示’a’,用62H表示’b’.
7.3 以字符形式给出的数据
assume cs:code , ds:data
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start:
mov al,'a'
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
7.4 大小写转换的问题
比方‘A’的ASCII码是41H,'a’的ASCII码是61H.之间相差了20H。
通过比较发现,第五位如果是0就是大写,第五位为1就是小写。
assume cs:codesg, ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s: mov al,[bx]
and al,11011111b
mov [bx],al
inc bx
loop s
mov cx,11
s0: mov al,[bx]
or al,00100000b
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
7.5 [bx+idata]
mov ax,[bx+200] ;其实就是bx偏移地址加上200
;同 mov ax, [200+bx]、mov ax, 200[bx]、mov ax,[bx].200 一样
问题 7.1
ax = 00beh
cx = 0600h
cx = 0606h
7.6 用[bx+idata]的方式进行数组的处理
mov ax, datasg
mov ds, ax
mov bx, 0
mov cx,5
s:mov al,0[bx]
mov 0[bx],al ;这里就是[bx+idata]
mov al,5[bx]
or al,00100000b
mov 5[bx],al
inc bx
loop s
7.7 SI 和 DI
si 和 di 在8086CPU中功能与 bx 相近。但不能将其分成两个8位寄存器使用。
问题 7.2
assume cs:codesg, ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesg segment
start: mov ax,datasg
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,4c00
int 21h
codesg ends
end start
问题 7.3
用更少的代码实现问题7.2中的程序
assume cs:codesg, ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesg segment
start: mov ax,datasg
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,4c00
int 21h
codesg ends
end start
7.8 [bx+si] 和 [bx + di]
可以用 [bx+si] 和 [bx+di],也可以使用 [bx][si]的方式。
问题 7.4
ax= 00beh bx = 1000h cx = 0606h
7.9 [bx+si+idata]和[bx+di+idata]
问题 7.5
ax = 0006h
bx = 226ah
cx = 226ah
7.10 不同的寻址方式的灵活应用
问题7.6
assume cs:codesg, ds:datasg
datasg segment
db '1. file '
db '2. edit '
db '3. search '
db '4. view '
db '5. options '
db '6. help '
datasg ends
codesg segment
start:
mov ax,segment
mov ds,ax
mov bx,0
mov cx,6
s: mov al,[bx+3]
and al,11011111b
mov [bx+3], al
add bx, 16
loop s
codesg ends
end start
问题 7.7
assume cs:codesg, ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0: mov dx,cx
mov si,0
mov cx,3
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
mov cx, dx
add bx,16
loop s0
codesg ends
end start
问题7.8
显然内存单元可以用于暂存数据。
一般来说,在需要暂存数据的时候,我们都应该使用栈
assume cs:codesg, ds:datasg, ss:stacksg
datasg segment
db 'ibm '
db 'dec '
db 'vax '
datasg ends
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
codesg segment
start:
mov ax,segment
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,4
s0: push cx
mov si,0
mov cx,3
s: mov al,[bx+si]
and al,11011111b
mov [bx+si],al
inc si
loop s
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
问题 7.9
assume cs:codesg, ds:datasg, ss:stacksg
stacksg segment
dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
codesg segment
start:
mov ax,stacksg
mov ss,ax
mov sp,16
mov ax,datasg
mov ds,ax
mov cx,4
s0: mov si,0
push cx
mov cx,4
s: mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s
and bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start