汇编-实验:将每个的单词的前4个字母改为大写字母(【bx+si+3】)

题目:

将每个的单词的前4个字母改为大写字母(

key

  • 两层的循环,用栈来暂存循环次数cx
  • 利用灵活的定位内存方法: 【bx+si+常数】
    bx表示行数,由于每个单词占用16个字节,故每次加16;si表示单词中的第几个字母,inc si;常数用来指示每个单词修改的起始地址

code 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
db '1. display '
db '2. brows '
db '3. replace '
db '4. modify '
datasg ends

stacksg segment
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 cx,4
mov bx,0
s:
mov si,0
push cx
mov cx,3
s0:
mov al,[bx+si+3]
and al,11011111b
mov [bx+si+3],al
inc si
loop s0

add bx,16
pop cx
loop s


mov ax,4c00H
int 21H
codesg ends

end start

在设置好ds 之后

p指令

我们发现p指令在没遇到loop循环指令时,其实是和t指令没什么不一样的,都是执行一步

但是遇到loop时,p指令就会执行完此处循环

此时执行完了一次内层循环,可以看到第一个单词的字母都已经修改完毕
这里我们注意下p指令执行的语句loop 001A


NEXT
我们接着运行,此时会遇到一个loop指令(外层的),p指令运行后

我们可以看到这次p指令执行后,所有单词都已经修改完成,可见此次p指令完成的是外层循环
我们对比此次p指令执行的语句loop 0013 和之前的可以发现,这次的p指令执行的循环跳转是0013比之前的001A小,说明是比上次跳转到的地方更之前的语句,也证实此次p指令一次执行完了外层的循环,而上一次的p指令一次性执行的是内层

总之,两个p指令,一个一次性执行完了内层,一个一次性执行了外层(当前肯定是要先执行完内循环)
注意点:看p 指令执行的是哪个loop执行 loop的地址是关键

按g一次性执行完程序后