目录

实验任务

  1. 分析一个奇怪的程序(课本实验8)

贴入代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
assueme cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax,0
int 21h
mov ax,0
s2: jmp short s1
nop
codesg ends
end start

首先用debug跟踪程序的每一步运行,看到程序能从start处开始执行

将s和s2程序段的偏移地址送到DI和SI寄存器中

将s2的内容复制到s处

继续执行代码跳转到代码段s处


此时s的代码段修改到cs:0

执行cs:0处的代码,程序正确返回

结论:

该程序可以正确返回

  1. 根据材料编程(课本实验9)

文本, 信件 描述已自动生成

文本, 信件 描述已自动生成

文本 描述已自动生成

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
45
46
47
assume cs:code, ds:data, ds:stack

data segment
db 'welcome to masm!'
db 02h,24h,71h ;三个颜色
data ends

stack segment
dw 8 dup(0)
stack ends

code segment
start:
mov ax,data
mov ds,ax
mov ax,0b800h ;es显示缓存区段
mov es,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,780h ;第12-14行,第12行开始
mov cx,3 ;写三行
mov si,10h ;指向颜色
s1:
push cx ;入栈,保存循环与颜色状态
push si
mov ah,[si] ;取出当前行颜色,存在ah
mov si,64 ;每行160字节,内容16字节,第64字节居中
mov di,0
mov cx,16
s2:
mov al,[di] ;取出当前字母,保存在al
inc di ;指向下一个字母
mov es:[bx+si],ax ;将ah的颜色与al的字母一起复制到缓存区段
add si,2 ;下一个字母
loop s2

add bx,00a0h ;下一行
pop si ;出栈
inc si ;下一个颜色
pop cx ;恢复循环状态
loop s1
mov ax,4c00h
int 21h
code ends
end start

运行结果如下:

  1. 有个sc1的字节数组,长度为32,请统计其中0的个数,并将统计结果存入zero中。

sc1 db 12,18,45,0,56, ……

Zero db ?

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
assume cs:code, ss:stack, ds:data

data segment
;32字节,共10个0
sc1 db 12,18,45,0,56,8,0,57,0,85,53,
176,120,194,0,161,171,0,227,0,12,0,
58,0,105,0,0,99,12,169,2,151
Zero db 0
data ends

stack segment
dw 8 dup(0)
stack ends

code segment

f: add ds:[Zero],1 ;0的个数加一
jmp s1 ;跳转回到循环中s1处
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h ;初始化数据段和栈段
mov bx,0 ;指向sc1字节数组中各个字节
mov cx,32 ;循环检查32次
s: push cx ;保存循环状态
mov cx,0
mov cl,[bx] ;将bx指向字节复制到cx中
jcxz f ;检查cx是否为0,跳转到代码段f处
s1: inc bx ;指向下一个字节
pop cx ;恢复循环状态
loop s
mov ax,4c00H
int 21H

code ends
end start

程序运行前,计数值为0:

程序运行后:

计数值为0A,转成成十进制就是10,说明数据中0的个数有十个