1. 实验任务1
使用任意文本编辑器,录入汇编源程序task1.asm
assume cs:code, ds:data
data segment
db ‘Nuist‘
db 5 dup(2)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
mov cx, 5
mov si, 0
mov di, 0f00h
s: mov al, [si]
and al, 0dfh
mov es:[di], al
mov al, [5+si]
mov es:[di+1], al
inc si
add di, 2
loop s
mov ah, 4ch
int 21h
code ends
end start
通过汇编、连接task1.asm得到task1.obj和task1.exe然后运行task1.exe,发现有输出结果绿色的NUIST:

使用debug工具对程序进行调试,执行到程序返回前,即line23之前,观察的结果如下图所示:


修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:

在loop中使用mov al, [5+si]读出并且输出,用于设置显示颜色。
2表示绿色,3表示蓝色,4表示红色,5表示紫色,6表示橙色
2. 实验任务2
已知数据段data中定义字节数据如下:
data segments
db 23, 50, 66, 71, 35
data ends
编写代码:
assume cs:code, ds:data
data segment
db 23,50,66,71,35
data ends
code segment
start:
mov ax,0810h
mov es,ax
mov ax,data
mov ds,ax
mov ax,0
mov si,0
mov di,0
mov cx,5
s: mov al,ds:[di]
mov bl,10
div bl
add al,48
add ah,48
mov es:[si],al
mov es:[si+1],ah
mov ah,2
mov dl,es:[si]
int 21h
mov ah,2
mov dl,es:[si+1]
int 21h
mov ah,2
mov dl,32
int 21h
add si,2
inc di
mov ax,0
loop s
mov ah,4ch
int 21h
code ends
end start
运行结果如下 可见数字依次输出:

3. 实验任务3
实验3源代码如下:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
使用debug工具对task3.exe进行调试:

u命令后输入21是因为一共有4100h个空间,只剩下21h

使用g命令调试:

ds变为076a:

(1)data段中的数据是:23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09,观察到的结果和理论分析一致。

(2)CPU执行程序,程序返回前,cs=076c ss=076b ds=076a
(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2, stack段的段地址为X-1
4. 实验任务4
实验4源代码如下:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
使用d命令查看数据:

(1)CPU执行程序,程序返回前,data段中的数据为0123h和0456h:

(2)CPU执行程序,程序返回前,cs=076c ss=076b ds=076a :

(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
(4)如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为[1+N/16],([]表示取整)
5. 实验任务5
实验5源代码如下:
assume cs:code, ds:data, ss:stack
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
end start
使用d命令查看数据:

(1)CPU执行程序,程序返回前,data段中的数据为0123h和0456h:

(2)CPU执行程序,程序返回前,cs=076a ss=076e ds=076d :

(3)设程序加载后,code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4
6. 实验任务6
如果将实验任务3,4,5中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个仍然可以正确执行?请说明原因。
实验任务5改后调试:

只有实验任务5的程序还能够正确执行。因为没有指明程序入口时,cs设定为ds+10,即PSP后的位置作为程序入口,而(3)的代码段放在了最前面,刚好对应上
7. 实验任务7
使用任意文本编辑器,录入汇编源程序task7.asm:
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 8 dup(0)
c ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,c
mov es,ax
mov bx,0
mov cx,8
s:
mov ax,0
mov al,ds:[bx]
add al,ds:[bx+16]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21
code ends
end start
使用debug工具对task7.exe进行调试:


8. 实验任务8
使用任意文本编辑器,录入汇编源程序task8.asm:
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov cx,8
mov si,0
mov sp,10h
s: push [si]
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
执行代码,观察b段,可以看到求解成功

