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

Task1 运行汇编程序并分析其功能

汇编程序如下:

 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, data
10         mov ds, ax
11 
12         mov ax, 0b800H
13         mov es, ax
14 
15         mov cx, 5
16         mov si, 0
17         mov di, 0f00h
18 s:      mov al, [si]
19         and al, 0dfh
20         mov es:[di], al
21         mov al, [5+si]
22         mov es:[di+1], al
23         inc si
24         add di, 2
25         loop s
26 
27         mov ah, 4ch
28         int 21h
29 code ends
30 end start

更改db 5 dup(2) 为 db 2,3,4,5,6. 更改前和更改后的效果分别如下所示:

line 15~25 将Nuist这个五个字符转换成大写,并修改成后五个字表示的颜色,输出到界面的底部。

Task2 在屏幕中输出数字

在屏幕中分别输出如下程序段中的数字:

data segments
      db 23, 50, 66, 71, 35
data ends

编写程序如下:

 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,ax
10     mov dh,0ah
11 
12     mov di,0
13     mov cx,5
14 s:    mov al,[di]
15     mov ah,00h
16     div dh
17     add al,30h
18     add ah,30h
19     mov bx,ax
20     inc di
21 
22     mov ah,2
23     mov dl,bl
24     int 21h
25     mov dl,bh
26     int 21h
27     mov dl,20h
28     int 21h
29     loop s
30  
31     mov ah,4ch
32     int 21h
33 code ends
34 end start

运行结果如下:

 

Task3 Debug汇编程序,回答问题(1)

程序如下:

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

(1)CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 97 09

(2)CPU执行程序,程序返回前,cs = 076C、ss  = 076B、ds = 076A

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

Task4 Debug汇编程序,回答问题(2)

程序如下:

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)CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00

(2)CPU执行程序,程序返回前,cs = 076C、ss  = 076B、ds = 076A

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

(4)对于如下定义的段:

    name segment
    ...
    name ends

  如果段中数据占N个字节,则程序加载之后,该段实际占有的空间为 ⌈N/16⌉*16

Task5 Debug汇编程序,回答问题(3)

程序如下:

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)CPU执行程序,程序返回前,data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00

 

 

 

 

(2)CPU执行程序,程序返回前,cs = 076A、ss  = 076E、ds = 076D

(3)设程序加载后,code段的地址为X,则data段的段地址为 X+3,stack段的段地址为 X+4

Task6 综合上面三个实验任务,分析当“end start”改为“end”时能否正确执行

只有 Task5 中的代码能正确执行。当代码存在"end start"时,程序会从start标记的位置开始执行,否则从头开始执行。Task5 中将代码书写在前面,程序从头执行,因此可以达到编写者想要的效果。

 

Task7 编写程序,将 a 段和 b 段中的数据一次相加,将结果保存到 c 段中

编写程序如下:

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 bx,0
    mov cx,8
s:     mov ax,ds:[bx]
    add ax,ds:[bx+16]
    mov ds:[bx+32],ax
    inc bx
    loop s
    mov ah,4ch
    int 21h
code ends
end start

结果如下:

 

 

Task8 编写程序,用push指令将 a 段中的钱 8 个字型数据,逆序存储到 b 段中

编写程序如下:

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 bx,0
    mov cx,8
s1:    push ds:[bx]
    add bx,2
    loop s1

    mov ax,b
    mov ds,ax

    mov bx,0
    mov cx,8
s2:    pop ds:[bx]
    add bx,2
    loop s2

    mov ah,4ch
    int 21h  
code ends
end start

运行结果如下:

 

posted @ 2020-11-25 22:44  Kusunoki  阅读(106)  评论(2编辑  收藏  举报