《零基础入门学习汇编语言》检测点6.1
本帖最后由 shuiyu 于 2017-7-14 23:06 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
第三十讲开始几分钟就是检测点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,
mov cs:,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, 使地址0000:0000地址的内容赋值给ax。
4.mov cs:,ax cs是一个段地址,而cs:就是指: 段地址+偏移地址;也就是我们题目中dw赋值的那八个字型数据的地址。
5.后面的步骤我就不一一解释了(后面都不会,前面肯定也不会滴{:5_109:} ),最重要的是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
pop cs:
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 入栈,即:0000:0000地址的内容进入栈段,段地址为:ss 偏移地址为35
6. pop cs: 出栈,即:把栈段,段地址为:ss 偏移地址为35中的内容复制到段地址为:ss 偏移地址为0里面(其实就是把0000:0000地址的内容复制到栈段中)
5.后面的步骤我就不一一解释了(后面都不会,前面肯定也不会滴{:5_109:} ),最重要的是5、6这两步,理解就一目了然。
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:} push 偏移地址不是34嘛 指向栈顶元素 第二题题设开辟了一个20字节的栈没卵用吧。。。栈从始至终都只用了2个字节的内存空间。 我居然看懂了 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 ax,10H 我想问栈顶不是应该指向25H吗,36是24H,当存一个数据的时候SP指向23H,空数据不就是25H吗
黑豆哥哥 发表于 2020-5-14 10:43
我想问栈顶不是应该指向25H吗,36是24H,当存一个数据的时候SP指向23H,空数据不就是25H吗
18个字占36个字节,地址从0开始算就是到35结束,sp指针指向36 丿灬Forever任 发表于 2020-8-14 10:03
18个字占36个字节,地址从0开始算就是到35结束,sp指针指向36
第一个dw 分配的地址为CS:0 -CS:f
第二个dw 10个字的空间地址为CS:10H- CS:23H 这段地址作为一个栈段的话,栈底的字单元地址为ss:sp=cs:22H
栈顶应该指向栈低的字单元的偏移地址+2 24H,36
因为这个程序里的栈存放的都是字单元是数据,暂定的位置不会是奇数,25H=37,不会是栈顶,
第一个栈元素sp-2的栈地址CS:22H(存放在CS:22H,23H这两个内存单元里),栈顶为CS:22H
第二个栈元素sp-2的栈地址CS:20H(存放在CS:20H,21H这两个内存空间里),栈顶为CS:20H
.....
会了会了,谢谢楼主 第(2)题第三空不能用cs吧,得用ss,cs会一直变的 应该是24H mov sp, 36这个为什么不是37,此时栈中并没有元素,说明栈为空,sp应该指向栈的下一个内存单元
页:
[1]