assume cs:code,ds:data
data segment
db 'unIX' ;以字符串形式给出数据,编译器转换成与其相应的ASCII码
db 'foRX'
data ends
code segment
start:
mov al,'a' ;将‘a’的ASCII码赋值给al
mov bl,'b'
mov ax,4c00h
int 21h
code ends
end start
编译、连接过程的界面图
用Debug查看data段中的内容
“大小写转换问题”程序
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'iNFOrMaTiOn'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax ;ds指向代码段
mov bx,0 ;(bx)=0,ds:bx指向'BaSiC'的第一个字符‘B’
mov cx,5 ;五个字符循环5次
s:mov al,[bx] ;将所指向的字符的ASCII码取出到al中
and al,11011111B ;根据大小写变换规律,将ASCII码的第5位置变为0,字母一定为大写
mov [bx],al ;将变换后的ASCII码写回原内存单元
inc bx ;ds:bx指向下一个字母
loop s
mov bx,5 ;(bx)=5,ds:bx指向'iNFOrMaTiOn'的第一个字符‘i’
mov cx,11 ;11个字符循环11次
s0:mov al,[bx]
or al,00100000B ;根据大小写变换规律,将ASCII码的第5位置变为1,字母一定为小写
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
用Debug查看data段中的内容,分析大小转换前后的变化
data段中转换前内容的界面图
data段中转换后内容的界面图
用Debug的A命令写入问题7.1中汇编指令(p144页)
Debug查看并分析程序执行后ax、bx、cx中的内容
用[bx+idata]方法编写程序
assume cs:codesg,ds:datasg
datasg segment
db 'BaSiC'
db 'MinIX'
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
mov cx,5
s:mov al,[bx] ;ds:bx定位到'BaSiC'第一个字符
and al,11011111b
mov [bx],al
mov al,[5+bx] ;采用相对寻址方式定位到'MinIX'第一个字符
or al,00100000b
mov [5+bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
用Debug查看data段中的内容,分析大小转换前后的变化
查看data段中转换前内容的界面图
查看data段中转换后内容的界面图
Debug中查看的结果界面
Debug中查看的结果
用Debug的A命令写入问题7.4中汇编指令
用Debug查看并分析程序执行后ax、cx中的内容
用Debug的A命令写入问题7.5中汇编指令
用Debug查看并分析程序执行后ax、bx、cx中的内容
Debug中查看的结果界面
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vax '
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
;将4个有16个字符的字符串当成一个4行16列的二维数组
mov cx,4 ;有4行,循环4次
s0:
mov si,0 ;s0,外循环,每行的循环
mov cx,3 ;有3列,循环3次
;s,内循环,每列的循环
s:mov al,[bx+si] ;定位到ds:[bx+si]的位置
and al,11011111b ;将第5位置0变成大写字母
mov [bx+si],al ;将变换完成的字母存回内存单元中
inc si ;指向下一列
loop s
add bx,16 ;偏移地址指向下一行
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
Debug中查看的结果
assume cs:codesg,ds:datasg
datasg segment
db 'ibm '
db 'dec '
db 'dos '
db 'vas '
dw 0 ;定义一个字暂存cx
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov bx,0
;将4个有16个字符的字符串当成一个4行16列的二维数组
mov cx,4 ;有4行,循环4次
s0:mov ds:[40h],cx ;将cx中外层循环的次数保存在datasg:40h内存单元中
mov si,0 ;每一列的偏移地址
mov cx,3 ;有3列,循环3次
s:mov al,[bx+si] ;定位到ds:[bx+si]的位置
and al,11011111b ;将第5位置0变成大写字母
mov [bx+si],al ;将变换完成的字母存回内存单元中
inc si ;指向下一列
loop s
add bx,16 ;偏移地址指向下一行
mov cx,ds:[40h] ;将存在内存单元中的循环次数恢复cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
Debug中查看的结果
assume cs:codesg,ss:stack,ds:datasg
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov di,0
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,0
mov cx,4
s0:push cx ;将外层的循环次数压入栈暂存在栈中
mov si,0 ;用si定位要修改的列
mov cx,4 ;改变每列的前四个单词,循环次数4次
s:mov al,[bx+si+3] ;每行第一个字母从第四个开始,常量3定位到每行要修改的起止地址
and al,11011111b
mov [bx+si+3],al
inc si ;定位到要修改的下一个字符
loop s
add bx,16 ;变换到下一行
pop cx ;从栈顶弹出原cx的值,恢复cx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
Debug中查看的结果