QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

VIP至尊会员

Rank: 15Rank: 15Rank: 15

积分
214
查看: 157|回复: 8

跳转指令与浮动装配(汇编相关)

[复制链接]
最佳答案
0 
累计签到:97 天
连续签到:1 天
比特阿尔法 发表于 2018-2-11 11:59:37 1578 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
本帖最后由 比特阿尔法 于 2018-2-12 09:56 编辑

        我在学王爽老师的第九章,在遇到 短转移  和  长转移  的时候很疑惑,
书上说:短转移  是通过位移,来修改IP  实现跳转的。
1.PNG



长转移   的机器指令 中就包含  标号的目的地址。
2.PNG


我的问题是:为什么长转移的目的地址在程序执行时,标号地址 永远是机器码的数值(也就是说不变的),
                    短转移 就一定要用 位移 来实现跳转,短转移的标号的地址是会变的吗?
楼层
跳转到指定楼层
最佳答案
8 
累计签到:1180 天
连续签到:4 天
lies_for_L 发表于 2018-2-11 15:01:21 | 显示全部楼层

回帖奖励 +20

本帖最后由 lies_for_L 于 2018-2-11 15:02 编辑

1. 纯汇编写程序的情况下
一般来说无论长短跳转其后都是固定值
  1. DATA SEGMENT
  2. STR1 DB ‘ABCDEFG′NEQU-STR1 ;给N赋值,表示当前指令的地址,-STR1表示当前位置到STR1头部的距离,也就是STR1的长度。
  3. STR2 DB ‘BCDEFG′MEQU-STR2
  4. MESS DB ‘NO MATCH!′RIGHTDB‘MATCH!’
  5. DATA ENDS
  6. CODE SEGMENT
  7. ASSUME CS:CODE,DS:DATA,ES:DATA

  8. BEGIN:
  9. MOV AX,DATA
  10. MOV DS,AX
  11. MOV AX,DATA
  12. MOV ES,AX
  13. MOV AL,N
  14. CMP AL,M ;比较长度是否相等,相等ZF=0,否则ZF=1
  15. JNZ EXIT ; 111111111 JNZ:jump if not zero ,zero 指的是比较结果,而不是ZF标志位的值
  16. LEA SI,STR1
  17. LEA DI,STR2
  18. MOV CL,N
  19. MOV CH,0
  20. CLD
  21. REPE CMPSB ;挨个比较单个字符,如果有一个不等就跳EXIT
  22. JNZ EXIT
  23. LEA DX,RIGHT
  24. JMP OUT1 ; 2222222222

  25. EXIT:
  26. LEA DX,MESS
  27. OUT1:
  28. MOV AH,9
  29. INT 21H
  30. MOV AH,4CH
  31. INT 21H

  32. CODE ENDS
  33. END BEGIN
复制代码

当你手写完一个程序后编译时除1 2 处其它代码已经知道长度,然后填充两处跳转,所以都是固定值


2. 高级写法,及高级语言写程序
jmp后能跟动态值,短跳转我还没看到有动态的,还不确定,短跳转一般是判断的时候使用
比如用jmp来call动态链接库里函数时,因为动态链接库是在运行时载入,载入地址不确定,就需要动态地址
1.png
2.png
最佳答案
0 
累计签到:97 天
连续签到:1 天
比特阿尔法  楼主| 发表于 2018-2-11 19:51:07 | 显示全部楼层
本帖最后由 比特阿尔法 于 2018-2-11 19:52 编辑
lies_for_L 发表于 2018-2-11 15:01
1. 纯汇编写程序的情况下
一般来说无论长短跳转其后都是固定值


谢谢,明白了,我还有一个疑问:长转移带的是标号的地址,从机器码中就可以看出来,如:EA 0B 01 BD 0B,翻译成汇编就是  jmp  far ptr 标号。问题是程序在编译时  不知道自己运行时是否会被加载到   0BBD:010B  这里,为啥要带着这个地址呢?还是它本来就知道自己会被加载到这里运行?

                               
登录/注册后可看大图
最佳答案
37 
累计签到:429 天
连续签到:1 天
兰陵月 发表于 2018-2-12 09:19:52 | 显示全部楼层

回帖奖励 +20

本帖最后由 兰陵月 于 2018-2-12 09:31 编辑


回复3#。。。。。。。。。。。。。。。。。
这涉及到的玩意就比较多了。以8086实模式为例(讲的肯定不全面,只是点了个知识点):
1、操作系统将程序重定位的时候,确定了程序加载到内存中的位置,这样每个段的段地址也就确定了。这其中的过程比较啰嗦,但不外乎就是先确定一个地址,然后从硬盘中把程序加载到内存指定位置。再确定每个段的段地址。
2、在执行1之间,还有一个编译过程,该过程是编译器多次扫描源程序之后,产生一个最后结果。你图中jmp fat ptr s在编译之后未运行之前有一个固定值,这个固定值在第1步的工作中又被替换成你在debug里看到的值。
保护模式下就更加复杂一点了,还涉及线性地址(虚拟地址)和硬件地址的转换,当然都是有规则的,都是可以反推的。

程序并不知道它会被加载到什么位置,所以在运行之前,远跳转后面跟的地址只是编译之后的地址,并不是运行时候的地址。运行的时候操作系统会自动更换地址。如果你自己写小型操作系统,那就必须自己编写加载规则,否则程序就不能正常运行。我们在DOS下面也好,在Windows下面也好,都是一个已经成型的操作系统,它都有一定的规则,编译器按照它们的规定和要求进行编译,这样DOS和Windows就能正确加载程序了。

建议学习完王爽老师的书后,再学习《x86汇编语言—从实模式到保护模式》,必定解答你心中的上述疑惑,只不过要学懂弄通的话,需要下点时间和功夫。
这本李老师的书是在裸机上运行的,也就是说纯粹基于硬件的,没有操作系统环境,所以学到后面的时候,是要从0000:7C00开始自己编写加载程序,自己编写用户程序,用自己的加载程序加载自己编写的用户程序。这样你问题中的各类跳转如何运作你一清二楚,当然,你能学到后面,肯定自己也都会了,都是很简单的事情。

突然感觉,推荐人学某本书,就像推荐人跳坑一样,计算机底层就是让欲罢不能的XX,知道了一点,就想一直搞下去,揭开它的面纱。
最佳答案
37 
累计签到:429 天
连续签到:1 天
兰陵月 发表于 2018-2-12 09:34:14 | 显示全部楼层
突然看到浮动装配4个字,哈哈哈哈哈哈

王爽老师果然不一般啊,重定位就重定位嘛,竟然换了浮动装配这么形象的词

最佳答案
0 
累计签到:97 天
连续签到:1 天
比特阿尔法  楼主| 发表于 2018-2-12 09:51:35 | 显示全部楼层
兰陵月 发表于 2018-2-12 09:19
回复3#。。。。。。。。。。。。。。。。。
这涉及到的玩意就比较多了。以8086实模式为例(讲的肯定不全 ...

谢谢月哥的耐心解释,小弟听懂了
最佳答案
0 
累计签到:97 天
连续签到:1 天
比特阿尔法  楼主| 发表于 2018-2-12 09:53:32 | 显示全部楼层
兰陵月 发表于 2018-2-12 09:34
突然看到浮动装配4个字,哈哈哈哈哈哈

王爽老师果然不一般啊,重定位就重定位嘛,竟然换了浮动装配这么 ...

为啥我看到一点感觉没有,差距好大
最佳答案
37 
累计签到:429 天
连续签到:1 天
兰陵月 发表于 2018-2-13 08:20:16 | 显示全部楼层
比特阿尔法 发表于 2018-2-12 09:53
为啥我看到一点感觉没有,差距好大

等你学习一下那种没有操作系统环境的汇编,体会自己去重定位的细节,你就会明白了。
最佳答案
0 
累计签到:97 天
连续签到:1 天
比特阿尔法  楼主| 发表于 2018-2-13 09:55:26 | 显示全部楼层
兰陵月 发表于 2018-2-13 08:20
等你学习一下那种没有操作系统环境的汇编,体会自己去重定位的细节,你就会明白了。

书我买了,等王爽的学完就看你推荐的那本

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /2 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2018-2-23 18:18

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