实验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,运行并观察结果。

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

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

db 5 dup(2)
--> 改成:
db 2,3,4,5,6

分析源代码中data段line4的字节数据的用途是?

答:控制显示的字符的颜色。

2. 实验任务2

源代码文件task2.asm

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 si,0

      mov cx,5
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 ends
end start

运行结果:

3. 实验任务3

源代码文件task3.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

①cpu执行程序,程序返回前,data段中的数据为多少?

答:不变

②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

①cpu执行程序,程序返回前,data段中的数据为多少?

答:不变。

②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。

④对于如下定义的段:

name segment
 ...
name ends

如果段中的数据占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

①cpu执行程序,程序返回前,data段中的数据为多少?

答:不变。

②cpu执行程序,程序返回前,cs=076ah,ss=076eh,ds=076dh。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。

6. 实验任务6

如果将task3,task4,task5中的最后一条伪指令“end start"改为”end",则哪个程序仍然可以正确执行?请说明原因。

答:task5可以正确执行,task3、task4不可以正确执行。因为若不指明标号,cpu顺序执行指令。

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

c1 segment   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c1 ends

code segment
start:
      mov ax,a
      mov ds,ax
      mov si,0

      mov cx,8
s:     mov al,[si]
      add al,[si+16]
      mov [si+32],al
      inc si
      loop s

      mov ax,4c00h
      int 21h
code ends
end start

在debug环境中,执行到程序返回前,查看逻辑段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,b
      mov ss,ax
      mov sp,16
    
      mov ax,a
      mov ds,ax
      mov bx,0
    
      mov cx,8
s:     push [bx]
      add bx,2
      loop s
    
      mov ax,4c00h
      int 21h
code ends
end start

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

执行前:

执行后:

posted @ 2020-11-26 17:05  北暮  阅读(140)  评论(2)    收藏  举报