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

2021/11/11 22:14:16

本文主要是介绍实验2 多个逻辑段的汇编源程序编写与调试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

实验任务1

任务1-1

 

 

 

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

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

任务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-2_, stack的段地址是 _X-1_。

任务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-4_, stack的段地址是 _X-2_。

任务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+2_, stack的段地址是_X+4_。

任务1-5

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

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 _int((N+1)/16)+1_。

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。

答:只有task1_4可以运行,end后的start表明源程序开始的地方为start,若无start,则程序从头开始运行,而其他三个程序的开头部分都为数据段,无法运行,只有task1_4的开头为代码段,能够运行。

实验任务2

源代码:

复制代码
 1 assume cs:code
 2 code segment
 3 start:
 4     mov ax,0b800H
 5     mov ds,ax
 6     mov bx,0f00H
 7     mov cx,80
 8 
 9 s:    
10     mov [bx],0403H
11     add  bx,2
12     loop s
13 
14     mov ah,4ch
15     int 21h
16 code ends
17 end start
复制代码

实验结果:

 

 

 

实验任务3

源代码:

复制代码
 1 assume cs:code
 2 data1 segment
 3     db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
 4 data1 ends
 5 
 6 data2 segment
 7     db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
 8 data2 ends
 9 
10 data3 segment
11     db 16 dup(0)
12 data3 ends
13 
14 code segment
15 start:
16     mov ax,data1
17     mov ds,ax
18     mov bx,0
19     mov cx,10
20 s:
21     mov al,ds:[bx]
22     add al,ds:[bx+16]
23     mov [bx+32],al
24     inc bx
25     loop s
26 
27     mov ah,4ch
28     int 21h
29 code ends
30 end start
复制代码

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

 

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

 

实验任务4

源代码:

复制代码
 1 assume cs:code
 2 
 3 data1 segment
 4     dw 2, 0, 4, 9, 2, 0, 1, 9
 5 data1 ends 
 6 
 7 data2 segment
 8     dw 8 dup(?)
 9 data2 ends
10 
11 code segment
12 start:
13     mov ax,data1
14     mov ds,ax
15     mov bx,0
16     mov ax,data2
17     mov ss,ax
18     mov sp,10h
19     mov cx,8
20 s:
21     push [bx]
22     add bx,2
23     loop s
24     
25     mov ah, 4ch
26     int 21h
27 code ends
28 end start
复制代码

原数据段截图:

在程序退出前,使用d命令查看数据段data2对应的内存空间的截图:

 

 

实验任务5

源代码:

复制代码
 1 assume cs:code, ds:data
 2 data segment
 3         db 'Nuist'
 4         db 5 dup(2)
 5 data ends
 6 
 7 code segment
 8 start:
 9         mov ax, data
10         mov ds, ax
11 
12         mov ax, 0b800H
13         mov es, ax
14 
15         mov cx, 5
16         mov si, 0
17         mov di, 0f00h
18 s:      mov al, [si]
19         and al, 0dfh
20         mov es:[di], al
21         mov al, [5+si]
22         mov es:[di+1], al
23         inc si
24         add di, 2
25         loop s
26 
27         mov ah, 4ch
28         int 21h
29 code ends
30 end start
复制代码

运行结果截图:

 

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

 

 

源代码中line19的作用是?

通过and方法,将所有的字母都转换为大写字母。

 

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

使字母呈现不同的颜色。

 

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

 

实验任务6

源代码:

复制代码
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Pink Floyd      '
 5     db 'JOAN Baez       '
 6     db 'NEIL Young      '
 7     db 'Joan Lennon     '
 8 data ends
 9 
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov bx,0
15     mov cx,4
16 s:
17     mov al,[bx]
18     or al,00100000b
19     mov [bx],al
20     add bx,16
21     loop s
22        
23    mov ah, 4ch
24    int 21h
25 code ends
26 end start
复制代码

原数据截图:

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

实验任务7

源代码:

复制代码
 1 assume cs:code, ds:data, es:table
 2 
 3 data segment
 4     db '1975', '1976', '1977', '1978', '1979' 
 5     dw  16, 22, 382, 1356, 2390
 6     dw  3, 7, 9, 13, 28 
 7 data ends
 8 
 9 table segment
10     db 5 dup( 16 dup(' ') )  ;
11 table ends
12 
13 code segment
14 start:
15     mov ax,data
16     mov ds,ax
17     mov ax,table
18     mov es,ax
19     mov bx,0
20     mov si,0
21     mov cx,5
22 s1:
23     mov ax,[bx]
24     mov es:[si],ax    
25     mov ax,[bx+2]
26     mov es:[si+2],ax
27     add bx,4
28     add si,16
29     loop s1
30     
31     mov bx,20
32     mov cx,5
33     mov si,5
34 s2:
35     mov ax,0
36     mov es:[si+2],ax 
37     mov ax,[bx]
38     mov es:[si],ax
39     add bx,2
40     add si,16
41     loop s2
42 
43     mov bx,30
44     mov cx,5
45     mov si,10
46 s3:
47     mov ax,[bx]
48     mov es:[si],ax
49     add bx,2
50     add si,16
51     loop s3
52 
53     mov cx,5
54     mov si,0
55 s4:     
56     mov ax, es:[si+5] 
57     mov dx, es:[si+7] 
58     div word ptr es:[si+10]
59     mov es:[si+13],ax
60     add si,16
61     loop s4
62 
63     mov ah, 4ch
64     int 21h
65 code ends
66 end start
复制代码

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

 

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

 

 

 



这篇关于实验2 多个逻辑段的汇编源程序编写与调试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程