shuiyu 发表于 2017-8-25 18:39:45

《零基础入门学习汇编语言》第四十八讲(含检测点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:}

小y同学 发表于 2018-3-18 15:16:17

为什么执行Push时IP为6?

shuiyu 发表于 2018-3-19 09:10:00

小y同学 发表于 2018-3-18 15:16
为什么执行Push时IP为6?

因为在执行到本条语句的时候,IP已经指向下一条语句了,这是前面的知识哦{:10_312:}(有可能我没表达清楚,但是就是这么个意思{:10_250:})

XT孓珏 发表于 2020-2-20 15:27:11

打卡
页: [1]
查看完整版本: 《零基础入门学习汇编语言》第四十八讲(含检测点10.1、10.2)