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

 

实验任务一

任务1-1:

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

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

 

 

回答问题:

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加载、跟踪调试,基于结果,回答问题。

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

 

 

 回答问题:

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

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

 

任务1-3:

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

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

 

 

回答问题:

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

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

 

任务1-4:

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

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

 

 

 

回答问题:

① 在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截图:

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

 task1_2截图:

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

 task1_3截图:

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

 task1_4截图:

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

由截图可知,只有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

 实验结果截图:

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

 

 

实验任务三

已知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

 

查看结果:

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

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

 

实验任务四

已知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

 

结果截图:

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

由图可知已实现要求

 

实验任务五

使用任意文本编辑器,录入汇编源程序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)

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

 

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

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

 

 

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

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

 

 

 

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

 

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

 实验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

 

运行结果如下

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

 

由截图可知效果已得到。

 

 实验任务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

 

实验结果截图:

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

 

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


下一篇:ADO.net一些测试