检测点 6.1
1. 在代码中使用栈
(1)我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。
(2)栈:记住以下三点应该差不多了
- 任意时刻 ss:sp 指向栈顶
- 当栈为空时,ss:sp 指向栈底还要加一,例如 若将 cs:10 ~ cs:2f 的内存空间当作栈来使用,当栈为空时, ss:sp 指向 2f+1 ,即 cs:30
- 栈的特性: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
标签:mov,codesg,6.1,dw,cs,ax,检测点,bx
From: https://www.cnblogs.com/alphadoiy/p/17538395.html