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

2021/11/12 9:39:59

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

实验任务1

任务1-1

<task1_1.asm>

调试到line19之前的截图:

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

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2_, stack的段地址是 _X-1_。(十六进制)

 

任务1_2

<task1_2.asm>

 调试到line19之前:

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

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

 

任务1_3

<task1_3.asm>

 调试到line19之前:

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

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

 

任务1_4

<task1_4.asm>

单步调试:

程序装入内存后,code段地址应为ds+10H,即076AH

执行mov ax,data后,ax为076CH,即程序装入后,data段段地址为076CH

执行mov ax,stack后,ax为076EH,即程序装入后,stack段段地址为076EH

回答问题:

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

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

 

任务1_5

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

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

task1_1, task1_2,task1_3无法执行(以task1_3为例):

task1_4可以执行,当不写程序执行的入口时,默认从头执行,因为开头为程序段,所以可以执行

实验任务2

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

运行结果:

实验任务3

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

<task3.asm>补充代码:

依次查看相加前、后三个逻辑段对应内存空间,确认结果相加后保存在逻辑段data3中,调试结果:

实验任务4

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

<task4.asm>补充代码:

使用d命令查看data2对应内存空间:

实验任务5

<task5.asm>

 1 assume cs:code, ds:data
 2 data segment
 3         db 'Nuist'
 4         db 2, 3, 4, 5, 6
 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            ;循环5次
16         mov si, 0             ;初始si偏移量为0
17         mov di, 0f00h     ;初始di偏移量为0f00h,为输出指定位置
18 s:      mov al, [si]          ;
19         and al, 0dfh         ;每一次把数据段的第一段(Nuist)的一个字母和11011111按位与运算,第三位置0,相当于减32(十进制)
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

循环实现功能:每次循环把Nuist的一个字母变为对应的大写字母,然后以第二个数据段对应位置的数字设置输出颜色,并显示到屏幕指定位置

line19作用:和11011111按位与运算,将字母转为对应大写字母

修改line4为 db 5 dup(2):

此处数字控制输出内容的前景,背景色。

实验任务6

将data段的每行第一个单词从大写->小写

<task6.asm>

 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Pink Floyd      '       ;16字节
 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    
15    mov al, 20h   ;00100000
16    mov bx, 0   
17    mov cx, 4       ;4行
18  s:
19    or [bx+0], al   
20    or [bx+1], al
21    or [bx+2], al
22    or [bx+3], al
23    add bx,16
24    loop s
25 
26    mov ah, 4ch
27    int 21h
28 code ends
29 end start

测试结果:

此题也可以使用嵌套循环,但注意循环次数cx需要用栈来存放。

实验任务7

将数据存入表中

<task7.asm>

 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 
18     mov ax,table
19     mov es,ax
20 
21     mov bx, 0
22     mov bp, 0          ;年份从第0位开始
23     mov cx, 5
24     s0:
25     mov ax, [bx] 
26     mov es:[bp], ax
27     mov ax,ds:[bx+2]
28     mov es:[bp+2], ax
29     add bx,4
30     add bp,16
31     loop s0
32 
33     mov bx, 20
34     mov bp, 5             ;收入从第5位开始
35     mov cx, 5
36     s1:
37     ;mov word ptr es:[bp+2], 0  ;空位置0
38     mov ax, [bx]
39     mov es:[bp], ax
40     add bx,2
41     add bp,16
42     loop s1
43 
44     mov bx, 30
45     mov bp, 10              ;人数从第10位开始
46     mov cx, 5
47     s2:
48     mov ax, [bx]
49     mov es:[bp], ax
50     add bx,2
51     add bp,16
52     loop s2
53 
54     mov bx,20
55     mov bp,13                ;人均收入从第13位开始
56     mov cx, 5
57     s3:
58     mov ax, [bx]
59     mov dl, ds:[bx+10]
60     div dl
61     mov es:[bp], al
62     ;mov byte ptr es:[bp+1], 0 空位置0
63     add bx,2
64     add bp,16
65     loop s3
66 
67     mov ah, 4ch
68     int 21h
69 code ends
70 end start

测试结果:



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


扫一扫关注最新编程教程