检测点 6.1

发布时间 2023-07-09 10:32:38作者: 三年、

检测点 6.1

1. 在代码中使用栈

(1)我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。
(2)栈:记住以下三点应该差不多了

  1. 任意时刻 ss:sp 指向栈顶
  2. 当栈为空时,ss:sp 指向栈底还要加一,例如 若将 cs:10 ~ cs:2f 的内存空间当作栈来使用,当栈为空时, ss:sp 指向 2f+1 ,即 cs:30
  3. 栈的特性:FILO

(3)dw 和 db:dw 为定义字型数据(十六位),db为定义字节型数据(八位)。

  • dw 的作用:既可以定义数据也可以开辟内存空间

2. 检测点

(1)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序:
解:

assume cs:codesg
codesg segment
     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start: mov ax,0
     mov ds,ax # 设置段地址为0,因为题目要求用用内存0:0~0:15单元中的内容
     mov bx,0 # 偏移地址从0到15
     mov cx,8 # 虽然16个单元,但每次复制一个字,只需循环8次
  s: mov ax,[bx] # 复制内存单元的值
     mov cs:[bx],ax # 改写程序中数据,从cs:0开始
     add bx,2
     loop s
     
     mov ax,4c00h
     int 21h
codesg ends
end start

(2)下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,数据的传送用栈来进行。栈空间设置在程序内。完成程序:

解:

assume cs:codesg
codesg segment
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        dw 0,0,0,0,0,0,0,0,0,0
start:  mov ax,cs # 因为程序中数据的段地址与程序的段地址是一致的
        mov ss,ax
        mov sp,36 # 程序中数据共18个字,一共36个字节
        mov ax,0
        mov ds,ax
        mov bx,0
        mov cx,8
s:      push [bx]
        pop cs:[bx]
        add bx,2  
        loop s
        
        mov ax,4c00h
        int 21h
codesg ends
end start