实验3 多个段的汇编源程序编写与调试
四、实验结论
1. 实验任务1
源代码文件task1.asm
1 assume cs:code, ds:data 2 data segment 3 db 'Nuist' 4 db 5 dup(2) 5 data ends 6 7 code segment 8 start: 9 mov ax, data10 mov ds, ax11 12 mov ax, 0b800H13 mov es, ax14 15 mov cx, 516 mov si, 017 mov di, 0f00h18 s: mov al, [si]19 and al, 0dfh20 mov es:[di], al21 mov al, [5 si]22 mov es:[di 1], al23 inc si24 add di, 225 loop s26 27 mov ah, 4ch28 int 21h29 code ends30 end start
运行结果:
在debug里调试到程序返回前的截图:
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。
1 db 5 dup(2) 2 --> 改成:3 db 2,3,4,5,6
源代码中data段line4的字节数据的用途是?
控制显示字符的颜色
2. 实验任务2
已知数据段data中定义字节数据如下:
1 data segments2 db 23, 50, 66, 71, 353 data ends
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。
源代码文件task2.asm
1 assume cs:code, ds:data 2 data segment 3 db 23,50,66,71,35 4 data ends 5 6 code segment 7 start: 8 mov ax, data 9 mov ds, ax10 11 mov si, 012 mov cx,513 s: mov ax,014 mov al, [si]15 mov bl,1016 div bl ;利用除法指令div,计算出每个数位上的数值17 mov bx,ax18 add bl,48 ;将十位数值转换成数字字符19 add bh,48 ;将个位数值转换成数字字符20 21 mov dl,022 mov ah,223 mov dl,bl24 int 21h ;利用系统调用int21h中的2号子功能,输出十位字符25 26 mov ah,227 mov dl,bh28 int 21h ;输出个位字符29 30 mov ah,231 mov dl,3232 int 21h ;输出空格33 inc si34 loop s35 36 mov ah, 4ch37 int 21h38 code ends39 end start
运行结果截图
3. 实验任务3
源代码文件task3.asm
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h 4 data ends 5 6 stack segment 7 dw 0, 0, 0, 0, 0, 0, 0, 0 8 stack ends 9 10 code segment11 start: mov ax,stack12 mov ss, ax13 mov sp,1614 15 mov ax, data16 mov ds, ax17 18 push ds:[0]19 push ds:[2]20 pop ds:[2]21 pop ds:[0]22 23 mov ax,4c00h24 int 21h25 26 code ends27 end start
①cpu执行程序,程序返回前,data段中的数据为多少?
data段不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2h,stack段的段地址为X-1h。
4. 实验任务4
源代码文件task4.asm
1 assume cs:code, ds:data, ss:stack 2 data segment 3 dw 0123h, 0456h 4 data ends 5 6 stack segment 7 dw 0, 0 8 stack ends 9 10 code segment11 start: mov ax,stack12 mov ss, ax13 mov sp,1614 15 mov ax, data16 mov ds, ax17 18 push ds:[0]19 push ds:[2]20 pop ds:[2]21 pop ds:[0]22 23 mov ax,4c00h24 int 21h25 26 code ends27 end start
①cpu执行程序,程序返回前,data段中的数据为多少?
data段不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为x,则data段的段地址为x-2h,stack段的段地址为x-1h。
④对于如下定义的段:、
1 name segment2 ...3 name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为____。
(N/16-1)*16 16个字节
5. 实验任务5
源代码文件task5.asm
1 assume cs:code, ds:data, ss:stack 2 3 code segment 4 start: mov ax,stack 5 mov ss, ax 6 mov sp,16 7 8 mov ax, data 9 mov ds, ax10 11 push ds:[0]12 push ds:[2]13 pop ds:[2]14 pop ds:[0]15 16 mov ax,4c00h17 int 21h18 19 code ends20 data segment21 dw 0123h, 0456h22 data ends23 24 stack segment25 dw 0,026 stack ends27 end start
①cpu执行程序,程序返回前,data段中的数据为多少?
data段不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为x,则data段的段地址为x-2h,stack段的段地址为x-1h。
6. 实验任务6
如果将task3,task4,task5中的最后一条伪指令“end start"改为”end",则哪个程序仍然可以正确执行?请说明原因
答:task5可以正确执行,“end start”的作用是指明程序的入口,若不指明程序入口,CPU则将按顺序执行,在内存中数据和指令都是以数据的形式存储,CPU无法自动识别哪些是指令哪些是数据,task3,task4在code段前都有数据段,据段的数据会被当成指令被编译执行,虽然可能也会正确运行但会产生一些错误,task5中code段位于开头,按顺序执行可以正确执行。
验证:
由上图可知,只有task63正确执行。
7. 实验任务7
完整源代码文件task7.asm
1 assume cs:code 2 a segment 3 db 1,2,3,4,5,6,7,8 4 a ends 5 6 b segment 7 db 1,2,3,4,5,6,7,8 8 b ends 9 10 c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称11 db 8 dup(0)12 c1 ends13 14 code segment15 start:16 mov ax,a17 mov ds,ax18 19 mov ax,c120 mov es,ax21 22 mov bx,023 mov cx,824 s: mov ax,025 add al,[bx]26 add al,[bx 16]27 mov es:[bx],al28 inc bx29 loop s30 31 mov ax,4c00h32 int 21h 33 code ends34 end start
在debug环境中,执行到程序返回前,查看逻辑段c的数据:
原始:
执行后:
8. 实验任务8
完整源代码文件task8.asm
1 assume cs:code 2 a segment 3 dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh 4 a ends 5 6 b segment 7 dw 8 dup(0) 8 b ends 9 10 code segment11 start: 12 mov ax,a13 mov ds,ax14 mov ax,b15 mov ss,ax16 mov sp,1617 18 mov bx,019 mov cx,820 s: push [bx]21 add bx,222 loop s23 24 mov ax,4c00h25 int 21h26 code ends27 end start
在debug环境中,执行到程序返回前,查看逻辑段c的数据
执行前:
执行后:
五、实验总结
尚存的问题:
实验内容一中,在debug中单步调试时出现意想不到的情况:mov es:[di],al后,N以默认方式显示在屏幕上,最后用p命令执行完的结果是绿色的UIST
若不用p命令,继续t命令单步执行,发现所有字母会按顺序显示出来,最后无结果显示在屏幕上