鱼C论坛

 找回密码
 立即注册
查看: 5723|回复: 10

[学习笔记] 《零基础入门学习汇编语言》检测点6.1

[复制链接]
发表于 2017-7-11 00:38:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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这两步,理解就一目了然。



谢谢小甲鱼带来的视频教程,感谢!!


   
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记 小白刚学,不对的请各位大佬指教,谢谢

评分

参与人数 1荣誉 +6 鱼币 +6 收起 理由
小甲鱼 + 6 + 6 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-22 03:48:06 | 显示全部楼层
push 偏移地址不是34嘛 指向栈顶元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-18 16:44:35 | 显示全部楼层
第二题题设开辟了一个20字节的栈没卵用吧。。。栈从始至终都只用了2个字节的内存空间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-7-23 00:09:56 From FishC Mobile | 显示全部楼层
我居然看懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-14 10:43:51 | 显示全部楼层
我想问栈顶不是应该指向25H吗,36是24H,当存一个数据的时候SP指向23H,空数据不就是25H吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

18个字占36个字节,地址从0开始算就是到35结束,sp指针指向36
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-29 15:54:01 | 显示全部楼层
会了会了,谢谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 16:37:56 | 显示全部楼层
第(2)题第三空不能用cs吧,得用ss,cs会一直变的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-18 21:43:00 From FishC Mobile | 显示全部楼层
应该是24H
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表