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

一、实验一

1.ex1

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
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指
令的功能。
    mov cx, 5                定义步长为5,5次循环
    mov si, 0                初始化 si
    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                   循环执行

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

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

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

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

 

 

基于观察,分析、猜测这里的数值作用是什么。

答:存放数据颜色信息

二、实验二

已知数据段data中定义字节数据如下: 
data segments
  db 23, 50, 66, 71, 35
data ends 
编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。
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 dh,0ah

    mov di,0
    mov cx,5
s:    mov al,[di]
    mov ah,00h
    div dh
    add al,30h
    add ah,30h
    mov bx,ax
    inc di

    mov ah,2
    mov dl,bl
    int 21h
    mov dl,bh
    int 21h
    mov dl,20h
    int 21h
    loop s

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

 三、实验三

ex3.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

使用masm、link对ex3.asm进行汇编、链接

 1.程序返回前,data 段中的数据是多少?

答:23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09

2.程序返回前,cs=076C,ss=076B,ds=076A

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

四、实验四

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

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

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

4.  对于定义如下的段:

name segment
…
name ends

 如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为:16N×16

五、实验五

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

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

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

 

六、实验六

如果将“end start ”改为“end”(也就是说不指明程序入口),则哪些程序仍可以被正确执行?

答:不指明程序入口,那么程序会直接从最开始运行,所以只有ex5可以正常运行

七、实验七

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

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

    mov si,0
    mov cx,8
s:    mov ax,[si]
    add ax,[16+si]
    mov [32+si],ax

    inc si
    loop s

    mov ah, 4ch
    int 21h

code ends
end start

 

八、实验八

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,16

    mov bx,0

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

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

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-11-27 11:51  Dauntless_yin  阅读(98)  评论(2编辑  收藏  举报