实验5

实验内容

实验一

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

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

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

  1. 所以若代码段的段地址为 x,则数据段的段地址为 x−2,栈段的段地址为 x−1。

实验二

  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
  1. 查看cx,还是42字节。

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

  2. 用 debug 查看数据段和栈段中的数据:

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

  1. 所以若代码段的段地址为 x,则数据段的段地址为 x−2,栈段的段地址为 x−1。

实验三

  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
  1. 查看cx的值,发现cx值为44:

  1. 猜测可能也是系统为代码段分配了 10H 的整数倍字节的空间,然后还是对不上号,额,不懂

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

  1. 代码段的段地址为 x,则数据段的段地址为 x+3,栈段的段地址为 x+4。

实验四

没有 end start 也就没有 start 使得程序从头执行,也就是说只有 3. 中的程序才能正确执行,因为代码段写在了前面。

实验五

  1. 编辑,编译,连接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
  1. 查看 cx 得程序所占空间,代码段的大小为 56H - 3 * 10H =26H,反汇编得 a 、b 和 c 的段地址:

实验六

  1. 编写,编译,连接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
  1. 查看 cx 得程序所占空间,代码段的大小为 4FH - 20H - 10H =16H,反汇编得 a 和 b 的段地址:

posted @ 2018-11-26 22:58  饿江之鱼  阅读(130)  评论(0)    收藏  举报