鱼C论坛

 找回密码
 立即注册
查看: 5757|回复: 9

[学习笔记] 《零基础入门学习汇编语言》第四十九讲(含检测点10.3、10.4)

[复制链接]
发表于 2017-8-28 00:13:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 shuiyu 于 2017-8-28 00:17 编辑

越努力,越幸运。欢迎大家来看我的笔记 小白刚学,不对的请各位大佬指正,谢谢

一、call far ptr 标号
CPU 执行指令 “call far ptr 标号” 时,相当于进行:
push CS
push IP
jmp far ptr  标号


检测点10.3
下面的程序执行后,ax中的数值为多少?

内存地址   机器码                           汇编指令            解答分析
1000:0    b8 00 00                          mov ax,0           
1000:3    9a 09 00 00 10            call far ptr s              执行push cs 和push ip最后跳转到标号s处(此时
                                                                                CS=1000,IP=8指向下一条指令)
1000:8    40                                inc ax
1000:9    58                                s:pop ax           出栈(先进后出还记得吧~)ax=8h
                                                    add ax,ax          ax=8h+8h=10h
                                                    pop bx             bx=1000h
                                                    add ax,bx         ax=1000h+10h=1010h




二、call 16位寄存器
CPU执行call 16位reg时,相当于进行:
push IP
jmp 16位寄存器

检测点10.4
看题目之前先介绍一下BP:它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址。

回归题目:
下面的程序执行后,ax中的数值为多少?
内存地址        机器码                汇编指令                解答分析
1000:0        b8 06 00                mov ax,6               
1000:3        ff d0                        call ax                执行push ip然后执行 jmp 6跳转到1000:6处(此时CS=1000,IP=5指
                                                                        向下一条指令)
1000:5        40                        inc ax
1000:6        58                        mov bp,sp        bp=sp=fffeh 在上面已经解释BP了,因为sp里面放的是堆顶的地址,所以
                                                                        bp也是栈顶的地址了

                                        add ax,[bp]        因为,bp里面放的是栈顶的地址,所以 [bp] 寄存器寻址后 [bp]实际是代表该
                                                                        地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,
                                                                        所以[bp]得到的内容就是5(先前在call ax时候压入的ip的值)。
                                                                        故ax=[6+ss:(fffeh)]=6+5=0bh





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

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

评分

参与人数 3荣誉 +6 鱼币 +13 收起 理由
grant1944 + 3 + 5
小甲鱼 + 5
不二如是 + 3 + 3 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-8-29 11:48:59 From FishC Mobile | 显示全部楼层
加油一起努力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-31 15:48:15 | 显示全部楼层

谢谢,一起加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-18 15:34:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-20 16:52:20 | 显示全部楼层
检测点10.4,楼主是怎么知道SP的值的?(sp=fffeh)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-20 15:50:21 | 显示全部楼层
打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-4 16:26:32 | 显示全部楼层
10.4算到6+5这一步都没有问题,然后6+5=0aH
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-1 11:20:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-19 11:43:58 | 显示全部楼层
本帖最后由 yuxinajie 于 2020-6-19 12:19 编辑

10.3
书上没有说是下一条指令的偏移地址,反观机器码9A 09 00 00 10,所以压入栈的顺序和值应该是 10 00 00 09。而非08
S:POP AX   ---- AX = 0009H
ADD AX,AX ---- AX = 0012H
POP BX      ---- BX = 1000H
ADD AX,BX ---- AX = 1012H

经过调试发现压入的IP偏移地址是08,看来是书本没有说清楚。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-25 15:04:06 | 显示全部楼层
徒手拆高达 发表于 2019-8-20 16:52
检测点10.4,楼主是怎么知道SP的值的?(sp=fffeh)

标准答案里面是这么写的,说bp=sp=fffeh,但是我觉得不一定就是fffeh。
不过是不是fffeh不重要,主要是bp=sp指向栈顶了,这里面的内容就是call ax压入的IP的值5,所以sp值具体是啥不重要了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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