(2011.10.29)汇编_王爽_第七章_学习小结

 

(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

你可能感兴趣的:(c,汇编,dos,IBM,basic,存储)