实验 5 编写、调试具有多个段的程序

时间:2021-07-01 01:24:29

1.

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)

实验 5 编写、调试具有多个段的程序

可见图中data段中的数据没变,依旧是0123, 0456, 0789, 0abc, 0def, 0fed, 0cba, 0987

(2)

cs=076C,ss=076B,ds=076A

(3)

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

分析:因为这段代码data段占了16个字节,stack段占了16个字节,所以段地址依次差一

2.

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)

实验 5 编写、调试具有多个段的程序

程序返回前,data段的数据没变,依旧是0123, 0456

(2)

cs=076C,ss=076B,ds=076A

(3)

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

(4)

name segment

...

name ends

改段中的数据占N个字节,则程序加载后,该段实际占有的空间为【N/17+1】*16个字节(【】为取整运算)

分析:这道题中虽然data段和stack段都只占了4个字节,但是依然分配了16个字节的空间,可以得出当0<N<=16时,则分配16个字节的空间,则可以得出上面的结论

3.

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)

实验 5 编写、调试具有多个段的程序

(1)

程序返回前,data段的数据没变,依旧是0123, 0456

(2)

cs=076A,ss=076E,ds=076D

(3)

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

分析:这里应该是因为代码先后的问题,导致了code段在前,但是代码只占了20h个字节,但系统自动加了两个字节为0,导致了code和data的段地址差了3,我猜如果code段之后有别的段且占了N个字节,则系统会分配【N/16+1】*16个字节的空间

4.

将1、2、3中的最后一条伪指令”end start“改为”end“

程序运行都没有报错,但是前两个会将代码段之前的数据段当成代码段来运行,进而没法正确执行,而3则可以正确执行

5.

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 ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
  db 8 dup(0)
c1 ends ; 改的时候要成对一起修改
code segment
start:
  mov ax,a
  mov ds,ax
  mov cx,4
  mov bx,0
s:  mov ax,ds:[bx]
  add ax,ds:[bx+10h]
  mov ds:[bx+20h],ax
  add bx,2
  loop s
  mov ax,4c00h
  int 21h
code ends
end start

实验 5 编写、调试具有多个段的程序

实验 5 编写、调试具有多个段的程序

6.

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,10h
  mov bx,0
  mov cx,8
s:  push ds:[bx]
  add bx,2
  loop s
  mov ax,4c00h
  int 21h
code ends
end start

实验 5 编写、调试具有多个段的程序

实验 5 编写、调试具有多个段的程序