实验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命令单步执行,发现所有字母会按顺序显示出来,最后无结果显示在屏幕上

来源:https://www.icode9.com/content-1-763901.html

(0)

相关推荐