鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 0

[学习笔记] 《零基础入门学习汇编语言》第四十六讲(含实验八)

[复制链接]
发表于 2017-8-15 18:49:26 | 显示全部楼层 |阅读模式

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

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

x

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

一、根据位移进行转移的意义
(1)前面我们讲到:
     jmp short 标号        (对IP的修改范围为 -128~127)
     jmp near ptr 标号    (对IP的修改范围都为-32769~32767)
     jcxz 标号            (对IP的修改范围都为-128~127)
     loop 标号
等几种汇编指令,它们对 IP的修改是根据转移目的地址和转移起始地址之间的位移来进行的。在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移距离。这样设计,方便了程序段在内存中的浮动装配。

(2)如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制;因为机器码中包含的是 s 的地址,如果 s 处的指令不在目的地址处,程序的执行就会出错。而loop s的机器码中包含的是转移的位移,就不存在这个问题了;因为,无论 s处的指令的实际地址是多少,loop指令的转移位移是不变的。

(3)通俗的讲就是类似于C语言中的自定义函数,可以重复调用,方便快捷

(4)注意,根据位移进行转移的指令,它们的转移范围受到转移位移的限制,如果在源程序中出现了转移范围超界的问题,在编译的时候,编译器将报错。


实验八:
1.PNG

运行程序前分析:根据题目可以分析得出程序最终跳转到s1处,执行s1处的命令,但是缺少了mov ax,4c00h这个结束命令;所以按照我的理解应该是不能正确返回的。

2.PNG

3.PNG
运行后:用debug单步执行发现,这个程序正确返回了  而且它最终没有跳到s1处,而是在执行s0: jmp short s命令后,跳到了s0处;理论上在跳到s处后,应该执行 s2:  jmp short s1命令(因为前面的命令已经把s:NOP 处的命令改成了s2处的命令了)。但是它却执行了jmp 0000这个命令。另我百思不得其解
但是我发现了一个问题,那就是执行  mov ax,cs:[si]   mov cs:[di],ax时,cs:[di]接收到的机器码是F6EB。而其实sc:[si]处的机器码为EBF6。具体集体是不是这个问题还是得看小甲鱼下一讲的详细解答








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

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

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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