(2011.10.29)汇编_王爽_第七章_学习小结
本章主要内容:
1. and 和 or 指令的使用
2. 嵌套循环问题的处理
3. 大小写转换的方法
4. 各种寻址方式的应用。[bx], [bx + idata], [bx + si(或di)], [bx + si + idata]
5. 栈的应用
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:704_大小写转换_[bx]实现.asm
; 程序功能:将内存单元中的小写字母转换成大写字母,大写字母转换成小写字母
assume cs:codesg, ds:datasg
datasg segment
db 'BaSiC' ; db占一个字节,每个字母占一个字节,这些字母连续存储在内存单元中
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:
mov ax, datasg
mov ds, ax ; 设置ds指向datasg段
mov bx, 0 ; 设置(bx) = 0, ds:bx 指向'BaSiC'的第一个字母
mov cx, 5 ; 设置循环次数为5,因为'BaSiC'有5个字母
; 转大写
s:
mov al, [bx] ; 将ASCII码从ds:bx所指向的单元中取出
and al, 11011111B ; 将al中的ASCII码的第五位置为零,变为大写字母
; 使用and指令,能将二进制代码置0
; ASCII码中,大写字母的二进制下标为5的值为0
mov [bx], al ; 将转变后的ASCII码写回原单元
inc bx ; (bx)加1,ds:bx指向下一字母
loop s
; 转小写
mov bx, 5 ; 设置(bx) = 5, ds:bx 指向'iNfOrMaTiOn'的第一个字母
mov cx, 11 ; 设置循环次数为11, 因为'iNfOrMaTiOn'有11个字母
s0:
mov al, [bx]
or al, 00100000B ; 将al中的ASCII码的第5位置置为1, 变为小写字母
; 使用or指令,能将二进制代码置1
; ASCII码中,小写字母的二进制下标为5的值为1
mov [bx], al
inc bx
loop s0
mov ax 4c00h
int 21h
codesg ends
end start
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:706_大小写转换_[bx+data]数组处理.asm
; 程序功能:将内存单元中的小写字母转换成大写字母,大写字母转换成小写字母
assume cs:codesg, ds:datasg
datasg segment
db 'BaSiC' ; db占一个字节,每个字母占一个字节,这些字母连续存储在内存单元中
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 ; and 运算,小写转换为大写
mov [bx], al ; 这里隐含了[0+bx],这种方法可以在同一个循环中定义多个字符串中的字符
;mov al, 0[bx] ; 上面语句的第二种表达方法
;mov al, [bx].0 ; 上面语句的第三种表达方法
mov al, [5+bx] ; 定义第二个字符串
or al, 00100000b ; or 运算,大写转换为小写
mov al, [5+bx] ; 这样就可以方便地定义数组了
;mov al, 5[bx] ; 上面语句的第二种表达方法
;mov al, [bx].5 ; 上面语句的第三种表达方法
inc bx
loop s
mov ax, 4c00h
int 21h
codesg ends
end start
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:707_大小写转换_[bx+data]二维数组处理_嵌套循环的使用.asm
; 程序功能:将内存单元中的小写字母转换成大写字母,大写字母转换成小写字母
assume cs:codesg, ds:datasg
datasg segment
db 'ibm ' ; 长度为16个字节
db 'dec '
db 'dos '
db 'vax '
datasg ends
; 上面的数据段中,可以将整个数据看作一个二维数组(4行*16列)
; ------------------------------------
; | 0 1 2 3 4 5 6 7 8 9 A B C D E F |(16进制内存单元位置表示)
; |00 i b m |
; |10 d e c |
; |20 d o c |
; |30 v a x |
; ------------------------------------
codesg segment
start:
mov ax, datasg
mov ds, ax
mov bx, 0 ; 该程序中,bx用于控制外循环中的步进大小
mov cx, 4 ; 此处为外循环的次数
s0:
mov dx, cx ; 将外循环的次数临时保存在dx中
mov si, 0 ; 该程序中,si用于控制内循环中的步进大小,每次从外循环进入时,清零
; si和di是8086CPU中和bx功能相近的寄存器
; si 目标变址寄存器
; di 源变址寄存器
mov cx, 3 ; 此处为内循环的次数
s:
mov al, [bx+si] ; 此时的偏移地址是 bx + si
and al, 11011111b ; 转为大写,第五位的数据设为零
inc si
loop s ; 以上为内循环内容
add bx, 16
mov cx, dx ; 将dx中存放的外层循环的计数值恢复到cx中
loop s0 ; 外层循环中的loop指令将cx中的数值减1
mov ax, 4c00h
int 21H
codesg ends
end start
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
; 程序名称:708_大小写转换_[bx+data]二维数组处理_嵌套循环的使用_栈的使用.asm
; 程序功能:将内存单元中的小写字母转换成大写字母,大写字母转换成小写字母
assume cs:codesg, ds:datasg, ss:stacksg
datasg segment
db 'ibm ' ; 长度为16个字节
db 'dec '
db 'dos '
db 'vax '
datasg ends
; 上面的数据段中,可以将整个数据看作一个二维数组(4行*16列)
; ------------------------------------
; | 0 1 2 3 4 5 6 7 8 9 A B C D E F |(16进制内存单元位置表示)
; |00 i b m |
; |10 d e c |
; |20 d o c |
; |30 v a x |
; ------------------------------------
stacksg segment ; 定义一个段,用来做栈段,容量为16个字节
dw 0, 0, 0, 0, 0, 0, 0, 0
stacksg ends
codesg segment
start:
mov ax, stacksg
mov ss, ax
mov sp, 16
mov ax, datasg
mov ds, ax
mov bx, 0
mov cx, 4
s0: push cx ; 将外层循环的cx值压栈
mov si, 0
mov cx, 3 ; cx设置为内层循环的次数
s: mov al, [bx+si]
and al, 11011111b
mov [bx+si], al
inc si
loop s
add bx, 16
pop cx ; 从栈顶弹出原cx的值,恢复cx
loop s0 ; 外层循环中的loop指令将cx中的计数值减1
mov ax, 4c00H
int 21H
codesg ends
end start