实验3 多个段的汇编源程序编写与调试
实验任务1
代码如下:
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
mov cx, 5 //循环5次
mov si, 0 //将0送到si寄存器中
mov di, 0f00h//设置初始地址
s: mov al, [si]//将[si]的值送入al
and al, 0dfh//转换字母为大写字母
mov es:[di], al//将结果保存至显示缓冲区
mov al, [5+si]//将第si+5个字节送入al
mov es:[di+1], al//保存数据
inc si//si+1
add di, 2//di+2
loop s
使用masm对代码进行汇编

使用link对代码进行链接

执行task1.exe,结果如下所示:

使用u命令进行精确反汇编

执行到程序返回前,即line27之前,观察结果

将line4改成db 2,3,4,5,6,重新汇编、链接、运行、观察结果

基于观察,分析、猜测这里的数值作用是什么?
数值的作用是改变字符的颜色。
实验任务2
data segments db 23, 50, 66, 71, 35 data ends
代码如下:
assume cs:code, ds:data
data segment
db 23, 50, 66, 71, 35
db 10 dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov cx,5
mov si,0
s1:
mov ah, 0
mov al, ds:[si]
mov bl, 10
div bl
mov ds:[si+5],al
mov ds:[si+6],ah
mov ah, 2
mov dl,ds:[si+5]
add dl, 30h
int 21h
mov ah, 2
mov dl, ds:[si+6]
add dl, 30h
int 21h
inc si
mov ah, 2
mov dl,“ ”
int 21h
loop s1
mov ah, 4ch
int 21h
code ends
end start
对程序进行汇编和链接

运行程序,得到十进制数字

实验任务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
对程序进行汇编和链接

使用r命令查看寄存器的值

查看data中的数据

使用u命令进行反汇编

程序返回前各个寄存器的数据和data数据如下所示:

1.CPU执行程序,程序返回前,data段中的数据为:0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
2.CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A
3.程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack段的段地址为:X-1
实验任务4
教材「实验5 编写、调试具有多个段的程序」(2)
代码如下:
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
将代码进行汇编和链接

进入debug,使用r命令查看寄存器的值并且查看data中的数据

使用u命令进行精确反汇编
运行至程序返回前查看data中的数据

程序返回前各个寄存器的数据:
1.CPU执行程序,程序返回前,data段中的数据为:0123H,0456H
2.CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH。
3.设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
4.如果段中的数据占N个字节,则程序加载后,这段实际占有的空间为:(N/16+1)*16
实验任务5
教材「实验5 编写、调试具有多个段的程序」(3)
代码如下所示:
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
对程序进行汇编和链接

进入debug,使用r命令查看寄存器信息
执行到程序返回前
1.CPU执行程序,程序返回前,data段中的数据为:0123h, 0456h
2.CPU执行程序,程序返回前,cs=076A ,ss=076E ,ds=076D
3.程序加载后,code段的段地址为X,则data段的段地址为:X+3 ,stack段的段地址为:X+4
实验任务6
「实验5 编写、调试具有多个段的程序」(4)
如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个程序仍然可以运行?请说明原因。
只有task5.exe可以正确执行,因为实验任务5的程序的data段和stack段都定义在程序的code段后,而其他实验的程序data段和stack段定义在程序的code前,将end start 改为end后,其他程序的data段和stack段将被当做程序执行,会出错,task5的程序从code段开始执行,所以不会出错。
实验任务7
「实验5 编写、调试具有多个段的程序」(5)
代码如下:
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
c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
db 8 dup(0)
c1 ends ;
code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov ss,ax
mov ax,c1
mov es,ax
mov bx,0
mov cx,8
s: mov ax,ds:[bx]
add ax,ss:[bx]
mov es:[bx],ax
add bx,1
loop s
mov ax,4c00h
int 21h
code ends
end start
对代码进行汇编和链接

进入debug,使用r语言查看寄存器的值。

对程序进行反汇编

查看结果,可以看到实现了题目要求

实验任务8
教材「实验5 编写、调试具有多个段的程序」(6)
代码如下:
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 bx,0
mov ax,b
mov ss,ax
mov sp,16
mov cx,8
s: push [bx]
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end start
将代码进行汇编和链接


对程序进行精确反汇编


查看逻辑段b的数据,可以看到实现了题目要求


浙公网安备 33010602011771号