ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-11 19:02:33  阅读:143  来源: 互联网

标签:__ 汇编 code segment mov ax bx 源程序 调试


 

实验任务一

任务1-1:

对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

 

回答问题:

1.在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = __076A__, 寄存器(SS) = __076B__, 寄存器(CS) = __076C__

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

 

任务1-2:

对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

 

 回答问题:

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

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

 

任务1-3:

对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

 

回答问题:

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

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X-4__, stack的段地址是__X-2__。

 

任务1-4:

对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

 

 

 

回答问题:

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

② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__, stack的段地址是__X+4__。

 

任务1-5

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

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

 ② 伪指令 end start 改成 end后得:

 task1_1截图:

 

 task1_2截图:

 

 task1_3截图:

 

 task1_4截图:

 

由截图可知,只有task1_4.asm程序仍然可以正确执行。这是因为任务1_1到任务1_3都是先定义数据段再定义代码段,而任务1_4是先定义代码段再定义数据段的。end start告诉程序,代码是从start开始,写成end后程序就从第一行开始编译。因为任务1_4代码段写在前面,从第一行编译不受影响。

 

实验任务二

编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数据03 04。

实验代码

assume cs:code
code segment
    mov ax, 0b800h
    mov ds, ax
    mov bx, 0f00h
    mov cx, 160
s: mov ax, 0403h
    mov [bx], ax
    add bx, 2h
    loop s

    mov ax,4c00h
    int 21h
code ends
end

 实验结果截图:

 

 

实验任务三

已知8086汇编源程序task3.asm代码片段如下。

task3.asm

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 ah, 4ch
    int 21h
code ends
end start

要求:

① 编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。

② 在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1, data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。

 

代码:

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 bx,0
    mov cx,10
    mov dx,0

 s:mov dx,0
    mov ax,data1
    mov ds,ax
    add dl,[bx]

    mov ax,data2
    mov ds,ax
    add dl,[bx]
    
    mov ax,data3
    mov ds,ax
    mov [bx],dl

    inc bx
    loop s
    mov ax,4c00h
    int 21h
        
code ends
end start

end start

 

查看结果:

由运行结果可知,实验要求已完成。

 

实验任务四

已知8086汇编源程序task4.asm代码片段如下。

task4.asm

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 ah, 4ch
int 21h
code ends
end start

要求:

① 补全程序,实现把逻辑段data1中的8个字数据逆序存储到逻辑段b中。

② 汇编、连接后,在debug中加载程序,运行到line15程序退出前,使用d命令查看数据段data2对应的 内存空间,确认是否实现题目要求。

 

补全后的代码:

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,data2
    mov ss,ax
    mov sp,10h
    
    mov ax,data1
    mov ds,ax   
    mov bx,0
    mov cx,8

 s: push [bx]
    add bx,2
    loop s
    mov ah, 4ch
    int 21h
code ends
end start

 

结果截图:

由图可知已实现要求

 

实验任务五

使用任意文本编辑器,录入汇编源程序task5.asm。

task5.asm

assume cs:code, ds:data
data segment
        db 'Nuist'
        db 2, 3, 4, 5, 6
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

阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指 令的功能。

对程序进行汇编、链接,得到可执行文件,运行并观察结果。

使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察 结果。

源代码中line19的作用是?

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

db 2,3,4,5,6
--> 改成:
db 5 dup(2) 或 db 5 dup(5)

基于观察,分析、猜测这里的数值作用是什么。

 

对程序进行汇编、链接,得到可执行文件,运行结果如下

 

 

使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察结果如下

 

 

 

源代码中line19的作用是实现将小写字母变成大写字母的操作

 

将line4的改为db 5 dup(2),结果截图如下:

 

 由图可知,这条语句的命令是改变字体的颜色。

 

实验任务六

已知8086汇编源程序task6.asm代码片段如下。

task6.asm

 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    ; ×××
13    mov ah, 4ch
14    int 21h
15 code ends
16 end start

要求:

① 补全程序,将data段中的每行第一个单词从大写->小写。

② 在debug中加载程序,反汇编,执行到line13退出前,用d命令查看data段对应的内存空间,确认每 行第一个单词已经由大写->小写。

 

补全后代码如下:

 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 
17 s0:mov dx,cx
18     mov cx,4
19     mov si,0
20 
21 s: or byte ptr [bx+si], 00100000b
22    inc si
23    loop s
24    add bx,10h
25    mov cx,dx
26    loop s0
27 
28    mov ah, 4ch
29    int 21h
30 code ends
31 end start

 

运行结果如下

 

 

由截图可知效果已得到。

 

 实验任务7

要求:

① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。 表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用 空格间隔。

② 汇编、连接后,在debug中加载、调试程序。灵活、合理使用u命令、g命令、d命令,显示刚开始逻 辑段table的数据信息,以及,结构化存入数据后,数据段table的数据信息,确认实现题目要求。

 

实验代码如下

 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 
16      mov ax, data
17     mov ds, ax
18     mov ax, table
19     mov es, ax
20     
21     mov bx, 0    ;年份
22     mov si, 0
23     mov cx, 5
24 s0:mov ax, [si]    
25     mov es:[bx], ax
26     mov ax, [si+2]
27     mov es:[bx+2], ax
28     add si, 4
29     add bx, 10h
30     loop s0
31 
32     mov bx, 0    ;收入
33     mov si, 14h
34     mov cx, 5
35 s1:mov ax, [si]
36     mov es:[bx+5], ax
37     mov ax, 0
38     mov es:[bx+5+2], ax
39     add si, 2
40     add bx, 10h
41     loop s1
42 
43     mov bx, 0    ;雇员数    
44     mov si, 1eh
45     mov cx, 5
46 s2:mov ax,[si]
47     mov es:[bx+0ah], ax
48     add si, 2
49     add bx, 10h
50     loop s2
51 
52     mov bx, 0    ;求商
53     mov cx, 5
54 s3:mov ax, es:[bx+5]
55     mov dx, es:[bx+5+2]
56     div word ptr es:[bx+0ah]
57     mov es:[bx+0dh], ax
58     add bx, 10h
59     loop s3
60     
61     mov ah, 4ch
62     int 21h
63 code ends
64 end start

 

实验结果截图:

 

标签:__,汇编,code,segment,mov,ax,bx,源程序,调试
来源: https://www.cnblogs.com/yanjiamu/p/15541249.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有