大小写的转换
规律:
A 41H 0100 0001
B 42H 0100 0010
C 43H 0100 0011
D 44H 0100 0100
E 45H 0100 0101
F 46H 0100 0110
a 61H 0110 0001
b 62H 0110 0010
c 63H 0110 0011
d 64H 0110 0100
e 65H 0110 0101
f 66H 0110 0110
我们可以发现a和A之间(大写与小写之间)相差了20H,转化成10进制是32 2^5
我们只需修改第六位就能实现大小写之间的相互转化
a and 1101 1111 就能实现‘a’转化成‘A’
A or 0010 0000 就能实现‘A’转化成‘a’
assume cs:code,ds:data,ss:stack
data segment
db 'BaSic'
db 'iFdOrMaTiOn'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start: mov bx,stack
mov ss,bx
mov sp,128
mov bx,data
mov ds,bx
mov bx,0
mov cx,5
upLetter: mov al,ds:[bx]
and al,11011111B
mov ds:[bx],al
inc bx
loop upLetter
mov ax,4C00H
int 21H
code ends
end start
将第二行字符串转换成小写
assume cs:code,ds:data,ss:stack
data segment
db 'BaSic'
db 'iFdOrMaTiOn'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start: mov bx,stack
mov ss,bx
mov sp,128
mov bx,data
mov ds,bx
mov bx,5
mov cx,11
dwLetter: mov al,ds:[bx]
or al,00100000B
mov ds:[bx],al
inc bx
loop dwLetter
mov ax,4C00H
int 21H
code ends
end start
编码的目的
逻辑运算非常快,能使程序更快
数据结构
访问内存的方式
ds:[bx+n]
2000:1000 BE 00 06 00 00 00 ......
mov ax,2000H
mov ds,ax
mov bx,1000H
mov ax,ds:[bx] ax=00BEH
mov cx,ds:[bx+1] cx=0600H
mov cx,ds:[bx+2] CX=0006H
将第一行转化成大写,第二行转化成小写的几种方式
第一行和第二行长度相同的情况下
方式一(两个循环)
assume cs:code,ds:data,ss:stack
data segment
db 'BaSic'
db 'MinIX'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start: mov bx,stack
mov ss,bx
mov sp,128
mov bx,data
mov ds,bx
mov bx,0
mov cx,5
upLetter: mov al,ds:[bx]
and al,11011111B
mov ds:[bx],al
inc bx
loop upLetter
mov bx,5
mov cx,11
dwLetter: mov al,ds:[bx]
or al,00100000B
mov ds:[bx],al
inc bx
loop dwLetter
mov ax,4C00H
int 21H
code ends
end start
方式二(一个循环)
assume cs:code,ds:data,ss:stack
data segment
db 'BaSic'
db 'MinIX'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start: mov bx,stack
mov ss,bx
mov sp,128
mov bx,data
mov ds,bx
mov bx,0
mov cx,5
change: mov al,ds:[bx]
and al,11011111B
mov ds:[bx],al
mov al,ds:[bx+5]
or al,00100000B
mov ds:[bx+5],al
inc bx
loop change
mov ax,4C00H
int 21H
code ends
end start
将第一行内存数据复制到第二行的三种方法
方法一:
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
copy: mov ax,ds:[si]
mov ds:[di],ax
add si,2
add di,2
loop copy
mov ax,4C00H
int 21H
code ends
end start
方法二:
assume cs:code,ds:data
data segment
db 'welcome to masm!'
db '................'
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
copy: mov ax,ds:[si]
mov ds:[di+16],ax
add si,2
loop copy
mov ax,4C00H
int 21H
code ends
end start
方法三
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db '................'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov,ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov si,0
mov di,16
mov cx,8
copy: push ds:[si]
pop ds:[si+16]
add si,2
loop copy
mov ax,4C00H
int 21H
code ends
end start
方法四
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db '................'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov,ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov es,ax ;dx:[si] es:[di]
mov si,0
mov di,16
mov cx,8
copy: mov ax,ds:[si]
mov es:[di],ax
add si,2
add di,2
loop copy
mov ax,4C00H
int 21H
code ends
end start
方法5:
assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!'
db '................'
data ends
stack segment stack
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start:
mov ax,stack
mov,ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov es,ax ;dx:[si] es:[di]
mov si,0
mov di,16
mov cx,8
copy: push ds:[si]
pop es:[di]
add si,2
add di,2
loop copy
mov ax,4C00H
int 21H
code ends
end start
[bx+si]和[bx+di] 偏移地址的的组合方式
用debug查看内存,结果如下
2000:1000 BE 00 06 00 00 00 ......
写出下面的程序执行后 ax,bx,cx 中的内容
mov ax,2000H ;ax=2000H
mov ds,ax ;ds=2000
mov bx,1000H ;bx=1000H
mov si,0
mov ax,ds:[bx+si] ;ax=2000:[1000+0] = 00 BE
inc si ;si = si+1=1
mov cx,ds:[bx+si] ;cx=2000:[1000+1] = 06 00
inc si ;si = si+1 =2
mov di,si ;di = si = 2
add cx,ds:[bx+di] ;cx=cx+2000:[1000+2] =06 00 + 00 06 = 06 06
[bx+si+数字] 和 [bx+di+数字]
用debug查看内存,结果如下
2000:1000 BE 00 06 00 6A 22 ......
写出下面的程序执行后 ax,bx,cx 中的内容
mov ax,2000H ;ax=2000H
mov ds,ax ;ds=2000
mov bx,1000H ;bx=1000H
mov si,0
mov ax,ds:[bx+2+si] ;ax=2000:[1000+0+2] = 00 06
inc si ;si = si+1=1
mov cx,ds:[bx+2+si] ;cx=2000:[1000+1+2] = 6A 00
inc si ;si = si+1 =2
mov di,si ;di = si = 2
mov bx,ds:[bx+2+di] ;bx=22 6AH
编程,将data段中的每个单词的头字母改成大写
assume cs:code,ds:data
data segment
db '1.file '
db '2.edit '
db '3.serch '
db '4.view '
db '5.options '
db '6.help '
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov si,2
mov cx,6
change: mov al,ds:[bx+si]
and al,11011111B
mov ds:[bx+si],al
add bx,16
loop change
mov ax,4C00H
int 21H
code ends
end start
编程,将data段中的每个字母都改成大写
assume cs:code,ds:data
data segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
data ends
code segment
start: mov ax,data
mov ds,ax
mov bx,0
mov cx,4
upRow: mov dx,cx
mov cx,3
mov si,0
change: mov al,ds:[bx+si]
and al,11011111B
mov ds:[bx+si],al
inc si
loop change
mov cx,dx
add bx,16
loop upRow
mov ax,4C00H
int 21H
code ends
end start
编程,将data段中的每个单词的前四个字母都改成大写
assume cs:code,ds:data,ss:stack
data segment
;0123456789ABCDEF
db '1. display '
db '2. prows '
db '3. replace '
db '4. modify '
data ends
stack segment
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
dw 0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,32
mov ax,data
mov ds,ax
mov bx,0
mov cx,4
upRows: push cx
mov cx,4
mov si,0
upletter: mov al,ds:[bx+si+3]
and al,11011111B
mov ds:[bx+3+si],al
inc si
loop upletter
pop cx
add bx,16
loop upRows
mov ax,4C00H
int 21H
code ends
end start
总结:我们应该合理安排数据,方便我们存取和使用