《零基础入门学习汇编语言》第四十八讲(含检测点10.1、10.2)
越努力,越幸运。欢迎大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指正,谢谢{:10_254:}一、ret 和 retf
用汇编语法记简单实用{:10_256:}
CPU执行ret指令时,相当于进行:
pop IP
CPU执行retf指令时,相当于进行:
pop IP
pop CS
检测点10.1
补全程序,实现从内存1000:0000处开始执行指令。
assume cs:code
stack segment
db 16 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ax, 1000h
push ax
mov ax,0
push ax
retf
code ends
end start
解:执行reft指令时,相当于进行:
pop ip
pop cs
根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。成功实现了,见下图:
二、call 指令
(1)CPU执行call指令,进行两步操作:
1.将当前的 IP或CS和IP 压入栈中(push IP)。
2.转移(jmp near ptr 标号 )。
(2)call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。
(3)call 标号
16位位移=“标号”处的地址-call指令后的第一个字节的地址;
16位位移的范围为 -32768~32767,用补码表示;
16位位移由编译程序在编译时算出。
检测点10.2
下面的程序执行后,ax中的数值为多少?
解:ax=6
1000:0 mov ax,0
1000:3call s ;当执行call s 时,相当先执行 push ip 后执行 jmp near ptr s,而执行Push时的IP为6
1000:6 inc ax ;执行上一句时,CS:IP是指向这一句指令的,但是由于又执行了jmp near ptr s这个指令,故跳过
了这条指令。但是我们也可以从这条指令中得知,在执行jmp near ptr s前,IP是指向1000:6的。
1000:7 s: pop,ax ;因为前面压入IP,所以这里得到前面压入的IP(IP等于6)
谢谢小甲鱼带来的视频教程,感谢!! {:10_303:}
本节结束,多谢览阅!
越努力,越幸运。谢谢大家来看我的笔记{:10_297:} 小白刚学,不对的请各位大佬指教,谢谢{:10_254:}
为什么执行Push时IP为6? 小y同学 发表于 2018-3-18 15:16
为什么执行Push时IP为6?
因为在执行到本条语句的时候,IP已经指向下一条语句了,这是前面的知识哦{:10_312:}(有可能我没表达清楚,但是就是这么个意思{:10_250:}) 打卡
页:
[1]