实验3 多个段的汇编源程序编写与调试

1. 实验任务1
使用任意文本编辑器,录入汇编源程序task1.asm。

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

使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果,

效果如下:

clip_image001[4]

使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果:

clip_image002

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:

clip_image002[8]

猜测这里的数值作用是设置字符颜色。


2. 实验任务2

源代码如下:

assume cs:code, ds:data
data segment
db 23,50,66,71,35
data ends

code segment
start:
mov cx,5
mov bx,data
mov ds,bx
mov  dh,0ah
mov di,0
s:
mov al,ds:[di]
mov ah,0
div dh
add al,30h
add ah,30h
mov bx,ax

mov ah,2
mov dl,bl
int 21h
mov dl,bh
int 21h
mov dl,32 
int 21h
mov ax,0

inc di
loop s

mov ah,4ch
int 21h

code ends
end start

运行结果:

clip_image002[10]

3. 实验任务3

源代码如下:

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

回答教材中①②③三个问题。

1.23 01 56 04  89 07 BC 0A EF 0D ED 0F BA 0C 87 09

2.076C 076B 076A

3.X-1 X-2

附上回答①时,反汇编查看data段中数据的截图。验证观察到的结果和理论分析是否一致。

clip_image002[12] 

程序运行,退出前也就是int21之前,由于该程序内部未修改data段内数值,因此可在程序加载后查看此时紧跟PSP后的区域,也就是data段。

附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

clip_image002[14]

4. 实验任务4

源代码如下:

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

回答教材中①②③④四个问题。

1.23 01 56 04

2.076C 076B 076A

3. X-1 X-2

4.((floor)((N+15)/16))*16

附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

clip_image002[16]

5. 实验任务5

源代码如下:

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

回答教材中①②③三个问题

1.23 01 56 04

2.076A, 076E, 076D

3.X+3 X+4

附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

clip_image002[5]

6. 实验任务6

第三个

未指明入口情况下,CPU按顺序执行,分不清数据和代码。前面程序代码段前有数据,会被当成指令编译执行,执行到ends后就停止了,所以会有问题;而第三个代码段就放置在前面,所以没有问题。

7. 实验任务7

源代码如下:

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   
   db 8 dup(0)
c ends

code segment
start:
mov ax,a
mov ds,ax
mov ax,b
mov es,ax
mov cx,8
mov ax,0
mov si,0
s:add ah,es:[si]
add ds:[si],ah
mov ax,0
inc si
loop s
mov si,0
mov cx,8
mov ax,c
mov es,ax
t:mov ah,ds:[si]
mov es:[si],ah
inc si
loop t
mov ax,4c00h
int 21h
code ends
end start

附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正
确实现了题目要求

clip_image002[1]

8. 实验任务8

源代码如下:

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 sp,10h
mov cx,8
mov si,0

s:push ds:[si]
add si,2
loop s

mov ax,4c00h
int 21h

code ends
end start

附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正
确实现了题目要求。

clip_image002[3]








posted @ 2020-11-26 21:28  bpcl  阅读(52)  评论(2)    收藏  举报