实验2 多个逻辑段的汇编源程序编写与调试
1. 实验任务1
1.1 任务1-1
- 源码
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
- 调试到line17结束、line19之前截图

- 问题回答
在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) = 0031
假设程序加载后,code段的段地址是X,则,data段的段地址是X-20H, stack的段地址是X-10H。
1.2 任务1-2
- 源码
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调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

- 问题回答
在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =076A, 寄存器(SS) =076B, 寄存器(CS) = 076C
假设程序加载后,code段的段地址是X,则,data段的段地址是 X-20H, stack的段地址是 X-10H。
1.3 任务1-3
- 源码
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调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

- 问题回答
在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) =076C, 寄存器(CS) = 076E
假设程序加载后,code段的段地址是X,则data段的段地址是 X-40H ,stack的段地址是 X-20H 。
1.4 任务1-4
- 源码
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_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

- 问题回答
在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = 076C, 寄存器(SS) =076E, 寄存器(CS) = 076A
假设程序加载后,code段的段地址是X,则,data段的段地址是X+20H, stack的段地址是X+40H。
1.5 任务1-5
基于上述四个实验任务的实践、观察,总结并回答:
- 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 ceil(N/16)*16。
xxx segment db N dup(0) xxx end
- 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。
解:只有task1_4.asm可以执行。因为将end start替换成end意味着程序未指定开始位置,整个代码段都被当做执行代码来执行,所以执行数据段中的数据自然会出错。
2. 实验任务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. 实验任务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 cx,10 mov bx,0 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
- 结果如下图所示
反汇编截图

运行前后

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,data1 mov ds,ax mov ax,data2 mov ss,ax mov sp,10h mov bx,0 mov cx,8 s: push ds:[bx] add bx,2 loop s mov ah, 4ch int 21h code ends end start
- 结果如下图所示
反汇编截图

运行结果截图

5. 试验任务5
- 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
- 实验结果截图

- 使用debug调试截图如下

- 源代码中line19的作用是?源代码中data段line4的字节数据的用途是?
答:line19的代码作用是小写变大写,data段line4是设置字体颜色
6. 试验任务6
- task6.asm源码
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 add bx,16 loop s mov ah, 4ch int 21h code ends end start
- 结果如下图所示
反汇编结果如下

数据段对于内存空间截图如下

7. 试验任务7
- task7.asm源码
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 si,0 mov di,0 mov bx,0 mov cx,5 mov sp,0 s: mov ax,[si] mov es:[di],ax mov ax,[si+2] mov es:[di+2],ax mov ax,[bx+20] mov es:[di+5],ax mov dx,0 mov es:[di+7],dx push cx mov cx,[20+10+bx] mov es:[di+10],cx div cx pop cx mov es:[di+0dh],ax add si,4 add di,16 add bx,2 loop s mov ah, 4ch int 21h code ends end start
- 结果如下



浙公网安备 33010602011771号