实验
编程1 将datasg段中每个单词的前四个字母改为大写字母
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
s:
push cx
mov cx,4
mov si,0
s0:
mov al,ds:[bx+3+si];这个地方必须要是 bx+(si/di)+(idata)这样的形式,()为可选内容
and al,11011111B;01100100 01000100--44
mov ds:[bx+3+si],al
inc si
loop s0
pop cx
add bx,16
loop s
mov ax,4c00h
int 21h
codesg ends
end start
出现的错误
and al,11011111b
少打了一个1
编程2 将datasg中的第一个字符串转换成大写,第二个字符串转成小写
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNfOrMaTiOn'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,1
mov cx,2
s:
mov al,ds:[bx]
and al,11011111b
mov ds:[bx],al
add bx,2
loop s
mov bx,6;这个bx要定位到 第二个字符串的第一个大写字母啊
mov cx,5
s0:
mov al,ds:[bx]
or al,00100000b
mov ds:[bx],al
add bx,2
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
出现的错误
- 第二个字符串定位是要在
第一个大写字母N
编程3 用si和di实现将字母串”welcome to masm!”复制到它后面的数据区中
assume cs:codesg,ds:datasg
datasg segment
db 'welcome to masm!'
db '................'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov si,0
mov di,10h
mov bx,0
mov cx,8
s:
mov ax,ds:[bx+si]
mov ds:[bx+di],ax
add si,2
add di,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
出现的错误
assume codesg
和code segment
不匹配- di寄存器写成bi
总结
这一章中,我们主要讲解了更为灵活的寻址方式的应用和一些编程方法,主要的内容有:
- 寻址方式 [bx]–编程2[bx+idata] [bx+si]–编程3[bx+si+idata]–编程1
- 二重循环问题的处理,处理两个循环loop都使用cx寄存器的时候,会出现冲突的问题.解决的最佳方式就是将cx的值暂时存储到栈空间中,等到再次回到外层循环的时候,再将其出栈,以此实现将互不影响.这里也能体现处在
调用函数
掉用被调用函数
的时候,将各个寄存器的值入栈,等到被调用函数
返回时,再将各个寄存器的值初始化到调用被调用函数
之前,这样就可以继续执行调用函数
,而不产生影响. - 栈的应用
- 大小写转换的方法
小写转大写and al,11011111b
大写转小写or al,00100000b
- and | or 指令