实验3 多个段的汇编源程序编写与调试
四、实验结论
1.实验任务1
源代码如下:
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
首先对task1.asm进行汇编连接:

直接执行观察到屏幕左下角出现NUIST绿色字符:

然后对生成的task1.exe进行debug,首先进行反汇编,然后根据反汇编执行到movah,4c前


将程序line4的数据进行修改如下:

重新进行汇编链接运行结果如下:

可以猜测line4中的数据时用于控制对应字符的颜色,并且2对应的是绿色,因此由本来的数组数据全2改成2,3,4,5,6时就只有字符N为绿色
2.实验任务2
源代码如下:
assume cs:code,ds:data data segment db 23, 50, 66, 71, 35 data ends code segment start: mov ax,data mov ds,ax mov cx,5 mov si,0 s: mov ax,0 mov al,[si] mov bl,10 div bl add al,30h add ah,30h mov [si+5],al mov [si+6],ah //将对应字符数据存于原数据段后 mov ah,2 mov dl, [si+5] int 21h mov ah,2 mov dl, [si+6] int 21h mov ah,2 mov dl, 32 int 21h inc si loop s mov ah,4ch int 21h code end end start
运行截图如下:

3.实验任务3
源代码task.asm如下:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
对程序进行debug截图如下:

回答:
①由d命令可以观察到数据段数据无变化
②cpu执行程序,程序返回前,cs=076cH,ss=076bH,ds=076aH
③设程序加载后,code段地址为X,则data段地址为X-2,stack段地址为X-1
4.实验任务4
源代码task4.asm如下:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
对汇编链接好的task4.exe进行debug截图如下:

答:①cpu执行程序,程序返回前,data段中的数据为多少?
与原数据不变
②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。
③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
④如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(N/16+1)*16取整。
5.实验任务5
task5.asm源代码如下:
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
对汇编链接后生成的task5.exe进行debug截图如下:

答:①由d命令可以观察到数据段数据为0123h和0456h
②cpu执行程序,程序返回前,cs=076aH ss=076eH ds=076dH
③设程序加载后,code段的段地址为x,则data段的段地址为x+3,stack段的段地址为x+4
6.实验任务6
如果将实验任务3,4,5中的最后一条伪指令“end start”改为“end”(也就是说,不指明程序的入口),则哪个仍然可以正确执行?请说明原因。
实验任务3修改后Debug:

以上为u 0 42的结果,可以发现修改前反汇编是从代码段开始,而修改后从ip:0即数据段开始进入,然后进行g命令执行若按照本来的g d则执行不完应该执行的代码,必须执行到40才能执行完本来的代码段,并且有可能因为执行数据段无关代码而发生错误:

实验任务4修改后debug,进行反汇编:

与实验任务3一样,是从数据段开始,不能用原来的命令通过g命令正常执行;
实验任务5修改后debug,进行反汇编如下:

使用g命令执行:

可以看见其正常执行,因为其代码段位于其他段前,所以无论有没有表明代码段入口都不影响。
7.实验任务7
task7.asm源代码如下:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov ax,c mov es,ax mov si,0 mov cx,8 s: mov ax,0 mov al,[si] add al,[si+16] mov es:[si],al inc si loop s mov ax,4c00h int 21H code ends end start
使用debug执行截图如下:
u命令进行反汇编:

g命令执行:

d命令查看c数据段内容发现执行成功

8.实验任务8
task8.asm代码如下:
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,a mov ds,ax mov ax,b mov ss,ax mov cx,8 mov si,0 mov sp,0010h s: push [si] add si,2 loop s mov ax,4c00h int 21h code ends end start
debug执行截图如下:

d命令查看成功逆序存入


浙公网安备 33010602011771号