实验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
-
程序返回前date中数据为
-
程序返回前,cs=076C、ss=076B、ds=076A
-
程序加载后,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
-
程序返回前,data段中的数据为
-
程序返回时,cs=076C、ss=076B、ds=076A
-
data段地址为X-2,stack段段地址为X-1
-
所占空间为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
-
data段中数据为
-
程序返回前,cs=076A,ss=076E,ds=076D
-
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