(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