第七章、更灵活的定位内存地址的方法
本文仅展示个别程序的debug图片,其实书上代码讲的很详细了,大家可以自己debug看一看
7.4大小写转换问题
;大写字母第五位是0,小写字母第五位是1
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
mov cx,5
s: mov al,[bx]
and al,11011111B ; 将第五位变成0
mov [bx],al
inc bx
loop s
mov ax,5 ;归位
mov cx,11
s0: mov al,[bx]
or al,00100000B
mov [bx],al
inc bx
loop s0
mov ax,4c00h
int 21h
codesg ends
end start
Debug看一下
原本数据内存中,显示的大小写是很不均匀,没有规则的
我们执行之后查看内存中的内容,发现大小写已经变换完成 😃
用类似于高级语言中数组的方式书写代码
assume cs:codefsg, 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]
and al,1101111b
mov [bx],al
mov al,[5+bx] ;第二个字符串
or al,00100000b
mov [5+bx],al
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end start
问题7.9
assume cs:code,ds:data,ss:stack
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
data ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov bx,0
mov cx,4 ;外层循环的cx
s0:
push cx
mov si,0
mov cx,4
s1:
mov al,ds:[bx+si+3] ;从第三个位置开始
and al,11011111b
mov ds:[bx+si+3],al
inc si
loop s1
add bx,16
pop cx
loop s0
mov ax,4c00h
int 21h
code ends
end start
debug如下
成功了 😃 😃 😃 😦😦😦