实验5
实验内容
实验一
- 编译,连接EX5_1.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
- 使用r命令查看cx的值,扣除数据段和栈段的 16 个字数据 (共占用 20 个字节) 可知代码段占用 22 个字节,对 cs:ip之后的22个字节反汇编得到:

- 使用 d 命令查看数据段的值:

- 程序返回前 cs、ss 和 ds 的值:

- 所以若代码段的段地址为 x,则数据段的段地址为 x−2,栈段的段地址为 x−1。
实验二
- 编译,连接EX5_2.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
- 查看cx,还是42字节。

-
怎么回事呢,不知道,问了一下大佬,貌似根据代码段的大小不变得出,数据段和栈段大小都为10,10个字节是系统为数据段和栈段分配的单位最小空间。
-
用 debug 查看数据段和栈段中的数据:

- 程序返回前 cs、ss 和 ds 的值:

- 所以若代码段的段地址为 x,则数据段的段地址为 x−2,栈段的段地址为 x−1。
实验三
- 编译,连接EX5_3.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
- 查看cx的值,发现cx值为44:

-
猜测可能也是系统为代码段分配了 10H 的整数倍字节的空间,然后还是对不上号,额,不懂
-
程序返回前 cs、ss 和 ds 的值:

- 代码段的段地址为 x,则数据段的段地址为 x+3,栈段的段地址为 x+4。
实验四
没有 end start 也就没有 start 使得程序从头执行,也就是说只有 3. 中的程序才能正确执行,因为代码段写在了前面。
实验五
- 编辑,编译,连接EX5_5_0.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
c segment
db 8 dup(0)
c ends
code segment
start: mov ax, a
mov ds, ax
mov ax, b
mov es, ax
mov cx, 8
mov bx, 0
s: mov dl, ds:[bx] ; ds 可以省略不写
add dl, es:[bx]
mov ax, c
push ds ; 使用栈的特性来 "保护现场"
mov ds, ax
mov [bx], dl
pop ds
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end start
- 查看 cx 得程序所占空间,代码段的大小为 56H - 3 * 10H =26H,反汇编得 a 、b 和 c 的段地址:

实验六
- 编写,编译,连接EX5_5_1.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 ; 利用栈先入后出的特性逆序存放到 b
mov sp, 16
mov bx, 0
mov cx, 8
s: push ds:[bx]
add bx, 2
loop s
mov ax, 4c00h
int 21h
code ends
end start
- 查看 cx 得程序所占空间,代码段的大小为 4FH - 20H - 10H =16H,反汇编得 a 和 b 的段地址:


浙公网安备 33010602011771号