本篇介绍《汇编语言》第7章 更灵活的定位内存地址的方法的实验
(1)将程序中所有讲解过的程序上机调试,用debug跟踪其执行过程,并在过程中进一步理解所讲内容。
大小写转换
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
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码的第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,变为小写字母
mov [bx],al
inc bx
loop s0
mov ax,4c00H
int 21H
codesg ends
end start
debug调试:
第一轮循环前面5个字符变大写
第二轮循环后11个字符变小写
SI和DI,BX的使用
assume cs:code,ds:data
data segment
db 'unIX'
db 'foRK'
data ends
code segment
start: mov bx,0
mov ax,[bx] ;将ds:[bx]代表的内存单元移入ax中
mov ax,cs:[bx] ;将cs:[bx]代表的内存单元移入ax中
mov ax,es:[bx] ;将es:[bx]代表的内存单元移入ax中
mov ax,ss:[bx] ;将ss:[bx]代表的内存单元移入ax中
mov si,0
mov ax,[si] ;将ds:[si]代表的内存单元移入ax中
mov ax,cs:[si] ;将cs:[si]代表的内存单元移入ax中
mov ax,es:[si] ;将es:[si]代表的内存单元移入ax中
mov ax,ss:[si] ;将ss:[si]代表的内存单元移入ax中
mov di,0
mov ax,[di] ;将ds:[di]代表的内存单元移入ax中
mov ax,cs:[di] ;将cs:[di]代表的内存单元移入ax中
mov ax,es:[di] ;将es:[di]代表的内存单元移入ax中
mov ax,ss:[di] ;将ss:[di]代表的内存单元移入ax中
mov ax,4c00H
int 21H
code ends
end start
debug调试:
BX的使用调试
SI的使用调试
DI的使用调试
(2)编程,完成问题7.9中的程序。
assume cs:codesg,ss:stacksg,ds:datasg
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 bx,0
mov cx,4
s0: push cx ;保存最外层循环的次数
mov si,0
mov cx,4 ;cx设置为内层循环的次数
s: mov al,[bx+3+si]
and al,11011111B
mov [bx+3+si],al
inc si ;下一个字符
loop s
add bx,16 ;下一行
pop cx
loop s0
mov ax,4c00H
int 21H
codesg ends
end start
debug调试: