实验2 多个逻辑段的汇编源程序编写与调试
1_1:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076a, 寄存器(SS) =076b, 寄存器(CS) =076c
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_x-2___, stack的段地址是_x-1___。
1_2:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076a, 寄存器(SS) =076b, 寄存器(CS) =076c
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_x-2___, stack的段地址是_x-1___。
1_3:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076a, 寄存器(SS) =076b, 寄存器(CS) =076c
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_x-4___, stack的段地址是_x-2___。
1_4:① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076c, 寄存器(SS) =076e, 寄存器(CS) =076a
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_x+2___, stack的段地址是_x+4___。
1_5:① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 16个字节。
② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
答:task1_5可以执行,因为“end start”改为“end”,则程序不能识别 start,会从程序开头,数据段和栈段开始执行,不是从程序代码开始,数据段和栈段所代表的代码则是乱码;task1_1、task1_2、task1_3的第一行都是定义的数据段,没有相应的指令,程序将会发生错误。
(1)汇编源码:
assume cs:code code segment mov ax, 0b800h mov ds, ax mov bx, 0f00h mov cx, 50h mov ax, 0403h s: mov ds:[bx], ax add bx, 2 loop s mov ah, 4ch int 21h code ends end
运行结果截图:

(1) 补充完整后的汇编源代码
assume cs:code ds:data1 ds:data2 ds:data3d 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 dx,0 mov cx,10 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 ah, 4ch int 21h code ends end start
(2) 在debug中加载、反汇编、调试截图

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

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

(1)补充完整后的汇编源代码
assume cs:code data1 segment dw 2,0,4,9,2,0,1,9 data1 ends data2 segment dw 8 dup(0) data2 ends code segment start: mov ax,data1 mov ds,ax mov ax,data2 mov ss,ax mov sp,16 mov cx,8 mov bx,0 s: mov ax,[bx] push ax add bx,2 loop s mov ah,4ch int 21h code ends end start
(2)在debug中加载、反汇编、调试截图

(3)要求给出,在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。

(1)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
(2)运行结果截图

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

(4)源代码中line19的作用是?
Line19的作用是将’Nuist’中的小写字母改为大写。
(5)源代码中data段line4的字节数据的用途是?
Line4的作用是改变输出的颜色。
(1)task6.asm源代码
assume cs:code, ds:data data segment db 'Pink Floyd ' ; 16字节 db 'JOAN Baez ' ; 16字节 db 'NEIL Young ' ; 16字节 db 'Joan Lennon ' ; 16字节 data ends code segment start: mov ax,data mov ds,ax mov bx,0 mov cx,4 s: mov al,ds:[bx] or al,0020h mov ds:[bx],al add bx,16 loop s mov ah, 4ch int 21h code ends end start
(2)在debug中加载、反汇编、调试截图

(3)要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。

(1) task7.asm源码
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' dd 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 s: mov ax,ds:[bx] mov dx,ds:[bx+2] mov es:[bp],ax mov es:[bp+2],dx mov byte ptr es:[bp+4],' ' add bx,4 add bp,10h loop s mov bp,0 mov cx,5 s1: mov ax,ds:[bx] mov dx,ds:[bx+2] mov es:[bp+5],ax mov es:[bp+7],dx mov byte ptr es:[bp+9],' ' add bx,4 add bp,10h loop s1 mov bp,0 mov cx,5 s2: mov ax,ds:[bx] mov es:[bp+0ah],ax mov byte ptr es:[bp+0ch],' ' add bx,2 add bp,10h loop s2 mov bp,0 mov cx,5 s3: mov ax,es:[bp+5] mov dx,es:[bp+7] div word ptr es:[bp+0ah] mov es:[bp+0dh],ax mov byte ptr es:[bp+0fh],' ' add bp,10h loop s3 mov ah, 4ch int 21h code ends end start
(2)调试截图
查看table段原始数据信息截图

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

浙公网安备 33010602011771号