实验二 多个逻辑段的汇编源程序编写与调试

四、实验结论

1. 实验任务1

任务1-1

task1_1.asm源码

task1_1调试到line17结束、line19之前截图

 

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS)

= _076B___, 寄存器(CS) = _076C___

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2h___, stack的段地址是

_X-1h___。

任务1-2

任务task1_2.asm源码

task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS)

= _076B___, 寄存器(CS) = _076C___

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2h___, stack的段地址是
_X-1h___。

任务1-3

任务task1_3.asm

 

 

 

task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

 

问题回答

① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS)

= _076C___, 寄存器(CS) = _076E___

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4h___, stack的段地址是

_X-2h___。

任务1-4

任务task1_4.asm源码

task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

问题回答

① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C___, 寄存器(SS) =

_076E___, 寄存器(CS) = _076A___

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2h___, stack的段地址

是__X+4h__。

任务1-5

基于上述四个实验任务的实践、观察,总结并回答:

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _(向上取整)[N/16]*16 byte__。

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成

end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。

        task1_4.asm可以正常运行,end start  指明程序的入口地址在标号start处,如果不指明程序的入口地址则默认

从程序的首部开始执行,而只有task1_4.asm的首部是程序段,1,2,3的首部不是程序段,所以不能正常运行。

 

2. 实验任务2

汇编源代码

 1 assume cs:code
 2 
 3 code segment
 4 
 5     mov ax, 0b800h
 6      mov ds, ax
 7      mov bx, 0f00h    
 8      mov cx, 80  ;循环80次
 9      
10      mov ax,0403h
11 s:     mov [bx],ax   ;将0403h放入内存
12      add bx, 2
13      loop s
14      
15      mov ax,4c00h
16      int 21h
17 code ends
18 end

 

运行结果截图

 

 3. 实验任务3

补充完整后的汇编源代码

assume cs:code
data1 segment
db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends
data2 segment
db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers
data2 ends
data3 segment
db 16 dup(0)
data3 ends
code segment
start:
    mov ax, data1
    mov ds, ax
    
    mov bx, 0
    mov cx, 10
s:    mov ax,[bx]    
    mov [bx+32],ax ;将data1中第一个数据放在data3中
    mov ax,[bx+16]
    add [bx+32],ax ;将data1与data2 数据相加放入data3中
    
    inc bx
    loop s    
mov ah, 4ch
int 21h
code ends
end start

 

在debug中加载、反汇编、调试截图

要求给出,在数据项依次相加之前,查看逻辑段data1, data2, data3对应的内存空间数据原始值的 debug命令和截图

以及,依次相加之后,查看逻辑段data1, data2, data3对应的内存空间数据原始值的debug命令和 截图

反汇编截图:

 

 

 相加前:

 

 相加后:

 

 4. 实验任务4

补充完整后的汇编源代码

assume cs:code
data1 segment
dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends
data2 segment
dw 8 dup(?)
data2 ends
code segment
start:
    mov ax, data1
    mov ds, ax
    mov si, 000eh   ;[si]指向data1段最后一个字单元
    mov di, 0        ;[16+di]指向data2段第一个字单元
    
    mov cx, 8
s:    mov word ptr ax, [si]
    mov word ptr [16+di], ax
    sub si, 2
    add di, 2
    loop s
    
mov ah, 4ch
int 21h
code ends
end start

 

在debug中加载、反汇编、调试截图 要求给出,在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。

 反汇编截图:

运行结果:

运行前 data1 和 data2 截图:

 

运行后 data1 和 data2 截图: 

 5. 实验任务5

task5.asm源码

 

 

 

运行结果截图

l

 

使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即line25执行之后、line27 执行之前)的截图

源代码中line19的作用是?

   利用大写字母和小写字母ASCLL码的规则,通过 and 1101 1111 运算将小写字母转换为大写字母。

源代码中data段line4的字节数据的用途是?

  改变字体的颜色。

  line4 改为: db  5 dup(2) :

  line4 改为: db  5 dup(9):

 

 6. 实验任务6

task6.asm源代码

assume cs:code, ds:data
data segment
db 'Pink Floyd      ' ; 16字节
db 'JOAN Baez       ' ; 16字节
db 'NEIL Young      ' ; 16字节
db 'Joan Lennon     ' ; 16字节
data ends
code segment
start:
    mov ax, data
    mov ds, ax
    
    mov bx, 0    
    mov cx, 4        ;外层循环 4行
            
s:    mov dx, cx      ;将外层循环的cx存起来
    mov si, 0
    mov cx, 4        ;内层循环 取出每句的前四个字母    
    
s0:    mov al, [bx+si]
    or al, 20h
    mov [bx+si], al
    inc si
    loop s0
    
    add bx, 16        ;第一句加16移到下一个句句首
    mov cx, dx
    loop s
    
    
    
mov ah, 4ch
int 21h
code ends
end start

 

 

在debug中加载、反汇编、调试截图

反汇编截图:

要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。

初始内存空间截图:

 

 运行结果截图:

 

 7. 实验任务7

task7.asm源码

assume cs:code, ds:data, es:table
data segment
db '1975', '1976', '1977', '1978', '1979'
dd 16, 22, 382, 1356, 2390
dw 3, 7, 9, 13, 28
data ends
table segment
db 5 dup( 16 dup(' ') ) ;
table ends
code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov di,0    ;data中指针
    
; 保存年份
    mov cx,5   ;外层循环    
    mov si,0    ;table行号
    
year:    mov dx,cx    ;保存外层循环cx
        mov cx,4    ;内层循环
        mov bx,0     ;table列号
        
year1:    mov al,ds:[di]
        mov es:[si+bx],al
        inc bx
        inc di
        loop year1
    
    mov cx,dx
    add si,16
    loop year

; 保存收入
    mov cx,5
    mov bx,5    ;从table 第五列开始存
    mov si,0    ;将table 行号置0
    
income:    mov word ptr ax,ds:[di]
        mov word ptr es:[si+bx],ax    ;收入低16位
        add di,2
        mov word ptr ax,ds:[di]
        mov word ptr es:[si+bx+2],ax    ;收入高16位
        add di,2
        add si,16
        
    loop income
    
; 保存雇员数
    mov cx,5
    mov bx,10    ;从table 第10列开始存
    mov si,0    ;将table 行号置0

num:    mov word ptr ax,ds:[di]
        mov word ptr es:[si+bx],ax
        add di,2
        add si,16
        
    loop num

;计算人均收入并保存
    mov cx,5
    mov bx,5    ;定位table 第5列收入  
    mov si,0    ;将table 行号置0

ave:    mov word ptr ax,es:[si+bx]        ;被除数 32 位    低 16 位
        mov word ptr dx,es:[si+bx+2]    ;被除数 高16位
        div    word ptr es:[si+bx+5]        
        
        mov es:[si+bx+8],ax
        add si,16
    loop ave
    
    

mov ah, 4ch
int 21h
code ends
end start

 

调试截图

查看table段原始数据信息截图

 

在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是 否按要求结构化地写入到指定内存

 

 

posted @ 2021-11-09 12:33  /muteall  阅读(70)  评论(1)    收藏  举报