|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 shuiyu 于 2017-7-14 23:06 编辑
越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢
第三十讲开始几分钟就是检测点6.1了,所以这一次笔记就先讲检测点的内容。
先准备一下需要在检测点用到的知识。
一、在代码段中使用栈
(1)我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。
(2)栈:记住以下两点应该差不多了
1.任意时刻,SS:SP指向栈顶元素。
2.出栈(push):减2。 入栈(pop): 加2。寄存器出栈的顺序要和入栈的顺序相反。
(3)dw和db:dw为定义字型数据(十六位),db为定义字节型数据(八位)。
二、检测点6.1
(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
mov bx,0
mov cx,8
s: mov ax,[bx]
mov cs:[bx],ax
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end start
答案剖析:
1.题目是要求我们要用内存0:0~0:15单元中的内容(就是0000:0000~0000:0015内存里的数据),所以题目定义DS为0,即使段地址指向0000:0000
2.bx、cx的赋值就不要我说了吧
3.然后是 s: mov ax,[bx] 使地址0000:0000地址的内容赋值给ax。
4.mov cs:[bx],ax cs是一个段地址,而cs:[bx]就是指: 段地址+偏移地址;也就是我们题目中dw赋值的那八个字型数据的地址。
5.后面的步骤我就不一一解释了(后面都不会,前面肯定也不会滴 ),最重要的是3、4这两步,理解就一目了然。
(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
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
答案剖析:
1.看清楚题目,第二个dw是十个字单元用作栈空间,故开辟了8+10=18个字的内存空间。所以赋值sp的时候要注意了
2.首先(就是入口开始1-3句)定义栈段,并且指向栈顶ss:sp; sp为36,为什么为36我第一步已经讲了
3.定义数据段(入口开始3、4句),即使段地址指向0000:0000
4.bx、cx的赋值就不要我说了吧
5.push [bx] 入栈,即:0000:0000地址的内容进入栈段,段地址为:ss 偏移地址为35
6. pop cs:[bx] 出栈,即:把栈段,段地址为:ss 偏移地址为35中的内容复制到段地址为:ss 偏移地址为0里面(其实就是把0000:0000地址的内容复制到栈段中)
5.后面的步骤我就不一一解释了(后面都不会,前面肯定也不会滴 ),最重要的是5、6这两步,理解就一目了然。
谢谢小甲鱼带来的视频教程,感谢!!
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢 |
评分
-
查看全部评分
|