. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  根据位移进行转移的意义 方便了程序段在内存中的浮动装配---- 浮动装配?  [待解决] 回复[ 11次 ]   点击[ 685次 ]  
zhllhz
[帖 主]   [ 发表时间:2009-12-19 19:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
程序被加载到某个内存区域后,在执行过程中还会换到别的内存区域?

是确实是这样子的

还是我理解错了
scuzg
[第1楼]   [ 回复时间:2009-12-19 19:57 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
你理解得非常正确!
你说的“根位移进行转移的意义”就是让代码在内存是“可浮动的”^-^。
不过倒不是“程序被加载到某个内存区域后,在执行过程中还会换到别的内存区域”,而是操作系统根据内存占用现状酌情给新加载的程序分配合适的内存空间。
zhllhz
[第2楼]   [ 回复时间:2009-12-19 22:35 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
回复:[第1楼]
------------------
浮动是cs:ip跳跃式变化的意思?
scuzg
[第3楼]   [ 回复时间:2009-12-20 08:01 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
不是,是变量和标号的偏移量保持不变,而 cs 、ds、ss 等由操作系统根据内存占用情况安排。这样访问变量和程序跳转都不会因为程序驻留内存的物理地址区域不同而改变,因为变量的偏移量和指令语句的 ip 值都没有发生变化。这有点像乘坐大巴,各位乘客的位置仅与座号有关,各位乘客在始发站、路途和终点站各自所处的地理位置是可变(浮动)的。
zhllhz
[第4楼]   [ 回复时间:2009-12-20 10:59 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
回复:[第3楼]
------------------
程序在被多次加载到内存中的时候 
不管操作系统为他分配的段地址变为多少
jmp所对应的机器码中的位移是不会变的
而他的意义:便于程序浮动装配 
是相对于其他类别的指令来说吗?
他怎么‘便于’了?
假如我的代码段中有一条指令MOV AX,1234H
被加载到内存中后他也是‘大巴上的固定座位的乘客’
有区别吗?
学长
你说代码在内存中是‘可浮动的’
是这段程序被多次加载的意思吗?
相对于你说的各位乘客在始发站、路途和终点站

我还是不怎么明白他怎么‘便于’程序浮动了
zhllhz
[第5楼]   [ 回复时间:2009-12-20 11:05 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
回复:[第1楼]

“根位移进行转移的意义”就是让代码在内存是“可浮动的”^-^。
------------------
没有位移他就是‘不可浮动’的了吗?
越想越不懂
scuzg
[第6楼]   [ 回复时间:2009-12-20 21:56 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
-u100 106
13CF:0100 EB04          JMP     0106  ;这04就是所谓的位移量,而跳转目标的物理地址应该是 13df6h
                                      ;如果以这个物理地址锁定跳转目标(jmp 13df6h),这样的代
                                      ;码显然是不可浮动的。
13CF:0102 90            NOP  
13CF:0103 90            NOP
13CF:0104 90            NOP
13CF:0105 90            NOP
13CF:0106 CD20          INT     20

要不我们先把问题弄简单点讨论。一个个来。另外我的QQ是28926141,要不那天细聊。
scuzg
[第7楼]   [ 回复时间:2009-12-20 22:13 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
这类代码:
        MOV AX,1234H 
        MOV BL,BH
由于这些代码和偏移量无关,所以程序载入的位置对代码没有影响。
zhllhz
[第8楼]   [ 回复时间:2009-12-23 21:57 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-12-18 19:17
我现在认为 ‘可浮动’ 是相对与程序被多次加载到内存而言 
由于操作系统的原因
他被加载到内存中的位置可能是不同的
这就是可浮动

位移 即目标IP和当前IP的差值
相对于JMP 寄存器类的段内转移来说
他们都没有涉及到如何避开使用物理地址的问题
所以没有便于浮动
也应该和可浮动无关
regex
[第9楼]   [ 回复时间:2010-01-19 00:49 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
所谓“可浮动”的意思是说, 每次把程序加载到内存后, 段地址都不是固定不变的。 cpu是靠偏移地址来寻址数据的 。 我初学, 这么认为的。 每次调试程序的时候, DS,ES,SS,CS都不确定, 也许这跟每次启动系统后加载的程序有关吧。
scuzg
[第10楼]   [ 回复时间:2010-01-19 09:47 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
楼主在8楼的阐述很正确。
tangdandang
[第11楼]   [ 回复时间:2010-01-25 22:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:1
注册日期:2010-01-22 20:12
呵呵今天刚刚看到这章我的理解跟楼主大致一样,根据操作系统学的一个进程的若干页面并不是一直驻留在内存中的,可能一些暂时未用到的页面会被暂时置换到外存上保存起来等用到的时候再调进内存这时该页面的地址跟上次很可能就不一样了,所以得用相对位移。一句话就是程序并不是只加载一次到内存
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved