汇编语言程序设计实验二:多个逻辑段的汇编源程序的编写与调试
实验二 多个逻辑段的汇编源程序的编写与调试
实验任务1
-
任务1-1
- task1_1.asm源码:
assume ds:data, cs:code, ss:stack data segment db 16 dup(0) data ends stack segment db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 16 mov ah, 4ch int 21h code ends end start-
对task1_1.asm进行编译连接:
![]()
-
调试到line17后,line19前
![]()
问题回答:
(1)此时DS=076A,SS=076B,CS=076C
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1
-
任务1-2
- task1_2.asm源码:
assume ds:data, cs:code, ss:stack data segment db 4 dup(0) data ends stack segment db 8 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 8 mov ah, 4ch int 21h code ends end start-
对task1_2.asm进行编译连接
![]()
-
调试到line17后,line19前
![]()
问题回答:
(1)此时DS=076A,SS=076B,CS=076C
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1
-
任务1-3
- task1_3.asm源码:
assume ds:data, cs:code, ss:stack data segment db 20 dup(0) data ends stack segment db 20 dup(0) stack ends code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 20 mov ah, 4ch int 21h code ends end start-
对task1_3.asm进行编译连接
![]()
-
调试到line17后,line19前
![]()
问题回答:
(1)此时DS=076A,SS=076C,CS=076E
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-4, stack的段地址是X-2
-
任务1-4
- task1_4源码:
assume ds:data, cs:code, ss:stack code segment start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, 20 mov ah, 4ch int 21h code ends data segment db 20 dup(0) data ends stack segment db 20 dup(0) stack ends end start-
对task1_4.asm进行编译连接
![]()
-
调试到line17后,line19前
![]()
问题回答:
(1)此时DS=076C,SS=076E,CS=076A
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X+2, stack的段地址是X+4
-
任务1-5
对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是: ceil(N/16) x 16
xxx segment db N dup(0) xxx ends如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成end , task1_4.asm仍然可以正确执行。因为task1_1.asm, task1_2.asm, task1_3.asm 以数据段开始,end start改为end,程序没有标出程序段结束位置,因此无法配对开始位置,识别不出是否为程序段,因此无法运行,而task1_4.asm以程序段开始,可以正常运行。
实验任务2
- 源代码:
assume cs:code code segment start: mov ax,0b800h mov ds,ax mov bx,0f00h mov cx,80 s: mov [bx],0403h add bx,2 loop s mov ah, 4ch int 21h code ends end start - 运行结果截图:
![]()
实验任务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 bx,0 mov cx,10 s: mov ax,data1 mov ds,ax mov 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 ah,4ch int 21h code ends end start -
在debug中加载、反汇编、调试截图
![]()
-
相加之前逻辑段data1, data2, data3对应的内存空间原始值截图:
![]()
-
相加之后逻辑段data1, data2, data3对应的内存空间原始值截图:
![]()
实验任务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,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 -
在debug中加载、反汇编、调试截图:
![]()
-
在程序退出前,使用d命令查看数据段data2对应的内存空间的截图:
![]()
实验任务5
-
源代码:
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) 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 -
运行结果截图:
![]()
-
使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27执行之前)的截图:
![]()
-
源代码中line19的作用是:将小写字母转换为大写字母
-
源代码中data段line4的字节数据的用途是:控制字体的颜色
-
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:
db 2,3,4,5,6 --> 改成: db 5 dup(2) 或 db 5 dup(5)此处改成 db 5 dup(2)则为绿色“ NUIST ”,改为 db 5 dup(5)则为品红色“ NUIST ”结果截图如下:
![]()
![]()
实验任务6
-
补充好的代码如下:
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov cx,4 s: mov al,[bx] or al,20h mov [bx],al mov al,[bx + 1] or al,20h mov [bx + 1],al mov al,[bx + 2] or al,20h mov [bx +2],al mov al,[bx + 3] or al,20h mov [bx+3],al add bx,16 loop s mov ah, 4ch int 21h code ends end start -
在debug中加载程序,反汇编,截图如下:
![]()
-
执行到line13退出前,用d命令查看data段对应的内存空间,确认每行第一个单词已经由大写->小写,截图如下:
![]()
实验任务7
-
补全程序代码如下:
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dw 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 bx, 0 mov bp, 0 mov cx, 5 col1: mov ax, [bx] mov es:[bp], ax mov ax, [bx+2] mov es:[bp+2], ax add bx, 4 add bp, 10h loop col1 mov bp, 5 mov cx, 5 col2: mov ax, [bx] mov es:[bp], ax add bx, 2 add bp, 10h loop col2 mov cx, 5 mov bp, 10 col3: mov ax, [bx] mov es:[bp], ax add bx, 2 add bp, 10h loop col3 mov cx, 5 mov bp, 5 col4: mov ax, es:[bp] mov bl, es:[bp+5] div bl mov es:[bp+8], al add bp,10h loop col4 mov ah, 4ch int 21h code ends end start -
debug中加载、调试程序并查看table段原始数据截图:
![]()
-
在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息已经按要求结构化地写入到指定内存,截图如下:
![]()
实验总结
- 基础知识是强机,掌握好基础知识后实验能够事半功倍
- 要善于利用实验进行查漏并利用自我研究与网络工具书进行补缺
- 及时的巩固总结能有效提升学习效果























浙公网安备 33010602011771号