实验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命令查看成功逆序存入

 

posted @ 2020-11-27 12:12  斐然曰  阅读(86)  评论(1)    收藏  举报