主题:问下大家~~地址差是以字节为单位的吗??
berger
[专家分:0] 发布于 2006-06-29 08:05:00
RT~~
还有个问题:一般一条指令长度为多少呢?是固定的值还是有变化的啊??@@[em1]
回复列表 (共10个回复)
沙发
wbsun111 [专家分:320] 发布于 2006-06-29 15:58:00
问下大家~~地址差是以字节为单位的吗??
不是
8086物理地址:20bit,不是字节长度
不过8086的偏移地址、段地址、IO地址是字节长度
一般一条指令长度为多少呢
是固定值,都是16bit
你还没有看完教科书啊,书上写的明明白白,教科书快被我翻烂叻~~
板凳
berger [专家分:0] 发布于 2006-06-29 21:47:00
呵呵,不好意思啊....
关键是有些问题不是很懂,比如:
[color=FF0000]短转移中,以字节作为地址差因为一个字节表示的地址差范围是-128~127,所以如果以转移指令本身为基准的话,短转移的范围在-126~129之间[/color]
这句话我就不是很明白,差的那个"2"....
有位朋友给我回的内容是:
[color=0000FF]以无条件转移指令的下一条指令为基准的话,那么短转移的范围就是-128至+127;如果以无条件转移指令本身为基准的话,那么短转移的范围就是-126至+129.总之就是一个指令长度的问题
其次,地址差是以字节为单位的(你所说的-128~127,-126~129实际上就是256,亦即相差(地址差)256个字节),-128~-126刚好相差2,亦即2个字节(即通常情况下一条指令的长度)[/color]
所以我就又有点搞不懂了....不是说一个字节可以表示的范围是-128~127吗?这不是已经换成10进制的了吗?这种情况下差的"2"表示2个字节啊???
3 楼
chenzep [专家分:3640] 发布于 2006-06-29 23:01:00
举个例子,下面的是源代码:
code segment
assume cs:code
start:
mov ax,1
jmp L1
mov ax,2
L1:
mov ax,4c00h
int 21h
code ends
end start
下面的是DEBUG的结果,也就是源代码对应的机器语言。
1435:0000 B80100 MOV AX,0001
1435:0003 EB03 JMP 0008
1435:0005 B80200 MOV AX,0002
1435:0008 B8004C MOV AX,4C00
1435:000B CD21 INT 21
-
对比一下,你应该很明显的看到,对于短跳转Jmp L1对应的机器指令是EB03H.
短转移指令jmp 对应的机器指令是EBH,后面的03H是偏移量,也就是问的问题的关键所在。
03H是这样计算出来的:
03h=Offset L1(也就是0008h)-刚执行完jmp指令后的ip数值(也就是0005h).
要说明的是,如果是长转移,jmp指令的机器代码不是0EBH,具体多少自己可以debug看看。
对于Intel 的CPU指令,不同的指令有不同的长度。
4 楼
berger [专家分:0] 发布于 2006-06-30 11:28:00
谢谢楼上的!
能不能针对我用"红色"标出的那段话给我解释以下呢??谢谢[em1]
5 楼
chenzep [专家分:3640] 发布于 2006-06-30 12:20:00
上面我已经解释的很清楚了,想一下EB03H中的03是怎么来的。
想清楚了,你的所有问题都解决了。
其实,这个过程是编译器完成的,我们大可以不必理会。
6 楼
berger [专家分:0] 发布于 2006-06-30 17:00:00
03H是目标地址(0008H)减去JMP指令的下一条指令的地址(0005H)得到的是吧??
这是以下一条指令为基准,如果以JMP指令本身为基准的话
两种情况下的-128~127与-126~129之间相差的"2"..真的,我还是不太明白..只是想弄明白点...也许你觉得这样已经很清楚了,可我真的还是不太懂..挺急的,呵呵,太菜了....-_
7 楼
chenzep [专家分:3640] 发布于 2006-06-30 18:27:00
就想你理解的一样,2就是短转移指令的长度。
你在哪个地方要用到这个知识点?
8 楼
berger [专家分:0] 发布于 2006-07-01 09:59:00
噢,其实就是在看书的时候看到这个了,就是杨季文编的<<80x86汇编语言程序设计教程>>,想来想去也不明白..感觉非常不爽~~呵呵
书的作者先是说:
[color=0000FF]如果地址差是一个字节,那么以无条件转移指令的下一条指令为基准的话,那么短转移的范围就是-128至+127[/color]
这个我可以理解,-128~127刚好是一个字节表示的范围嘛,可他马上又说:
[color=0000FF][color=FF0000]如果以无条件转移指令本身为基准的话,那么短转移的范围当然就是-126至+129[/color][/color]
介个....-_我就想怎么差2呢??这个"2"应该是10进制下的"2"吧??一条短转移指令的长度是"2"??感觉作者的意思好像就是只要是这种情况,都会是相差"2",短转移指令的长度总是"2"吗??指令长度有用10进制表示的吗??
PS:楼上如果被偶的"BC问题"搞得快崩溃的话,我先在这边说声不好意思哈~呵呵
9 楼
chenzep [专家分:3640] 发布于 2006-07-01 12:34:00
我建议看沈美明,温冬婵的《80X86汇编语言程序设计》,
网上还有一本很好的汇编电子书,地址:
http://www.mdjx.net/course/hep/huibianyuyan/course.htm
更多的基本资料可以去www.aogosoft.com下载。
10 楼
berger [专家分:0] 发布于 2006-07-01 13:38:00
恩,谢谢楼上的!!
[em1]
我来回复