shuiyu 发表于 2017-7-11 00:38:44

《零基础入门学习汇编语言》检测点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:}

湖人拿不了冠军 发表于 2019-6-22 03:48:06

push 偏移地址不是34嘛 指向栈顶元素

徒手拆高达 发表于 2019-7-18 16:44:35

第二题题设开辟了一个20字节的栈没卵用吧。。。栈从始至终都只用了2个字节的内存空间。

wudong552200 发表于 2019-7-23 00:09:56

我居然看懂了

被遗忘的指环 发表于 2020-2-20 22:21:31

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

黑豆哥哥 发表于 2020-5-14 10:43:51

我想问栈顶不是应该指向25H吗,36是24H,当存一个数据的时候SP指向23H,空数据不就是25H吗

丿灬Forever任 发表于 2020-8-14 10:03:32

黑豆哥哥 发表于 2020-5-14 10:43
我想问栈顶不是应该指向25H吗,36是24H,当存一个数据的时候SP指向23H,空数据不就是25H吗

18个字占36个字节,地址从0开始算就是到35结束,sp指针指向36

xttcqw 发表于 2020-8-30 16:48:24

丿灬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
.....

Bernice_ 发表于 2020-12-29 15:54:01

会了会了,谢谢楼主

章鱼DA 发表于 2021-1-26 16:37:56

第(2)题第三空不能用cs吧,得用ss,cs会一直变的

无先了 发表于 2023-10-18 21:43:00

应该是24H

fish111 发表于 2024-12-7 20:53:49

mov sp, 36这个为什么不是37,此时栈中并没有元素,说明栈为空,sp应该指向栈的下一个内存单元
页: [1]
查看完整版本: 《零基础入门学习汇编语言》检测点6.1