实验3 多个段的汇编源程序编写与调试
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
使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果,
效果如下:
使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果:
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:
猜测这里的数值作用是设置字符颜色。
2. 实验任务2
源代码如下:
assume cs:code, ds:data
data segment
db 23,50,66,71,35
data ends
code segment
start:
mov cx,5
mov bx,data
mov ds,bx
mov dh,0ah
mov di,0
s:
mov al,ds:[di]
mov ah,0
div dh
add al,30h
add ah,30h
mov bx,ax
mov ah,2
mov dl,bl
int 21h
mov dl,bh
int 21h
mov dl,32
int 21h
mov ax,0
inc di
loop s
mov ah,4ch
int 21h
code ends
end start
运行结果:
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
回答教材中①②③三个问题。
1.23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
2.076C 076B 076A
3.X-1 X-2
附上回答①时,反汇编查看data段中数据的截图。验证观察到的结果和理论分析是否一致。
程序运行,退出前也就是int21之前,由于该程序内部未修改data段内数值,因此可在程序加载后查看此时紧跟PSP后的区域,也就是data段。
附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。
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
回答教材中①②③④四个问题。
1.23 01 56 04
2.076C 076B 076A
3. X-1 X-2
4.((floor)((N+15)/16))*16
附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。
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
回答教材中①②③三个问题
1.23 01 56 04
2.076A, 076E, 076D
3.X+3 X+4
附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。
6. 实验任务6
第三个
未指明入口情况下,CPU按顺序执行,分不清数据和代码。前面程序代码段前有数据,会被当成指令编译执行,执行到ends后就停止了,所以会有问题;而第三个代码段就放置在前面,所以没有问题。
7. 实验任务7
源代码如下:
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,b
mov es,ax
mov cx,8
mov ax,0
mov si,0
s:add ah,es:[si]
add ds:[si],ah
mov ax,0
inc si
loop s
mov si,0
mov cx,8
mov ax,c
mov es,ax
t:mov ah,ds:[si]
mov es:[si],ah
inc si
loop t
mov ax,4c00h
int 21h
code ends
end start
附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正
确实现了题目要求。
8. 实验任务8
源代码如下:
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 sp,10h
mov cx,8
mov si,0
s:push ds:[si]
add si,2
loop s
mov ax,4c00h
int 21h
code ends
end start
附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正
确实现了题目要求。


![clip_image002[10] clip_image002[10]](https://img2020.cnblogs.com/blog/2175524/202011/2175524-20201126212759377-391573305.jpg)
![clip_image002[14] clip_image002[14]](https://img2020.cnblogs.com/blog/2175524/202011/2175524-20201126212800268-1181825320.jpg)
![clip_image002[16] clip_image002[16]](https://img2020.cnblogs.com/blog/2175524/202011/2175524-20201126212800799-1206584984.jpg)
![clip_image002[5] clip_image002[5]](https://img2020.cnblogs.com/blog/2175524/202011/2175524-20201126213038399-1365452866.jpg)
![clip_image002[1] clip_image002[1]](https://img2020.cnblogs.com/blog/2175524/202011/2175524-20201126212801319-1990301738.jpg)
![clip_image002[3] clip_image002[3]](https://img2020.cnblogs.com/blog/2175524/202011/2175524-20201126212801868-1990631431.jpg)
浙公网安备 33010602011771号