《零基础入门学习汇编语言》第四十九讲(含检测点10.3、10.4)
本帖最后由 shuiyu 于 2017-8-28 00:17 编辑越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}
一、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里面放的是栈顶的地址,所以 寄存器寻址后 实际是代表该
地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,
所以得到的内容就是5(先前在call ax时候压入的ip的值)。
故ax==6+5=0bh
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:}
加油一起努力 孤影09 发表于 2017-8-29 11:48
加油一起努力
谢谢,一起加油 {:10_254:} 检测点10.4,楼主是怎么知道SP的值的?(sp=fffeh) 打卡
10.4算到6+5这一步都没有问题,然后6+5=0aH{:10_266:} {:10_324:} 本帖最后由 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,看来是书本没有说清楚。 徒手拆高达 发表于 2019-8-20 16:52
检测点10.4,楼主是怎么知道SP的值的?(sp=fffeh)
标准答案里面是这么写的,说bp=sp=fffeh,但是我觉得不一定就是fffeh。
不过是不是fffeh不重要,主要是bp=sp指向栈顶了,这里面的内容就是call ax压入的IP的值5,所以sp值具体是啥不重要了。
页:
[1]