实验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

运行结果

debug里调试到程序返回前的截图

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

这里的值影响字符的样式

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 cx, 5
    mov si, 0
s:  mov al, [si]
    mov ah, 0
    
    mov dh, 10
    div dh
    mov dh, ah

    add al, 30H
    mov dl, al
    mov ah, 2
    int 21h

    mov ah, dh
    add dh, 30H
    mov dl, dh
    mov ah, 2
    int 21h

    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
  1. 程序返回前date中数据为

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

  3. 程序加载后,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
  1. 程序返回前,data段中的数据为

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

  3. data段地址为X-2,stack段段地址为X-1

  4. 所占空间为ceil(X/16)*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
  1. data段中数据为

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

  3. data段地址为X+3 stack段地址为X+4

6. 实验任务6

程序3可以正常执行,因为它的代码段放在前面,程序1和2会执行数据段。

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

code segment
start:
    mov ds, a
    mov cx, 8
    mov di, 0

s:  mov dl, 0
    mov es, b
    add dl, es:[di]
    add dl, [di]
    mov es, c1
    mov es:[di], dl
    inc di
    loop s

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

运行结果

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 sp, 010H

    mov cx, 8
    mov di, 0eh
s:  mov ax, [di]
    push ax
    add di, -2
    loop s

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

posted @ 2020-11-26 21:44  openseem  阅读(66)  评论(1编辑  收藏  举报