鱼C论坛

 找回密码
 立即注册
查看: 2834|回复: 12

8086汇编16章程序入口地址的直接定址表的问题

[复制链接]
发表于 2012-12-9 00:59:15 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 会飞的熊 于 2012-12-9 01:00 编辑

      书中16.4的例题中关于将子程序的入口地址存储在一个表中的一段程序。         setscreen: jmp short set
             table: dw sub1,sub2,sub3,sub4
                 set: push bx

                       cmp ah,3
                       ja sret
                       mov bl,ah
                       mov bh,0
                       add bx,bx

                       call word ptr table[bx]

               sret: pop bx
                       ret

1.上面的sub1,sub2,sub3,sub4地址标号,如果要取得他们的偏移地址值不是要offset吗,如果把他们当地址用不是只有数据标号才可以这这么用么?
2。table[bx]这里也把table当数据地址用了,如果可以把他们直接当地址用,还要offset干什么啊?

求大神解释。





最佳答案

查看完整内容

1.取得他们的偏移地址,其实不需要offset啦,编译器在遇到offset 标号和直接标号的时候,都是翻译的是他们的偏移地址。 第一张图:没有offset 直接标号。 第二张图:offset+标号 可以看到最后编译器编译完后,都是一样的,mov cx,003 说白了,offset是个伪指令,是给编译器看的,方便大家编程的,cpu可不认识。 2.关于offset 在16位汇编中,其实在要用到标号处的偏移地址的时候,加不加offset,编译器都能通过的。上面 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-9 00:59:16 | 显示全部楼层
本帖最后由 lukelqz 于 2012-12-9 15:28 编辑

1.取得他们的偏移地址,其实不需要offset啦,编译器在遇到offset 标号和直接标号的时候,都是翻译的是他们的偏移地址。
第一张图:没有offset 直接标号。
12.9.15.02.jpg
第二张图:offset+标号
12.9.15.04.jpg
可以看到最后编译器编译完后,都是一样的,mov cx,003
说白了,offset是个伪指令,是给编译器看的,方便大家编程的,cpu可不认识。
2.关于offset
在16位汇编中,其实在要用到标号处的偏移地址的时候,加不加offset,编译器都能通过的。上面有图为证。

在win32汇编中更多的是用于 获取某个全局变量的偏移
如:
.data
szText            db  'Win32 Assembly, Simple and powerful !',0
szCaption      db 'tips',0
.
.
.
.code
invoke MessageBox,NULL,offset szText,offset szCaption, MB_OK
这里就是获取szText的全局变量的偏移地址
offset还是挺有用的哈。


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

使用道具 举报

发表于 2012-12-9 21:39:50 | 显示全部楼层
不解释,你懂得,问甲鱼哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-10 15:53:31 | 显示全部楼层

懂了,我来操作试试,谢谢解答啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-10 16:52:18 | 显示全部楼层
本帖最后由 会飞的熊 于 2012-12-10 17:04 编辑

Image00001.jpg 我自己实验的时候发现如果是mov ax,a编译器会自动添加一个步骤就是把s当成[si]来用变成mov ax,[si]
而mov ax,offset a,就是把是的偏移地址给ax,从图中可以看出两次赋值ax的值是不同的。是因为编译器的版本不同造成的的么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-10 17:05:18 | 显示全部楼层
lukelqz 发表于 2012-12-9 00:59
1.取得他们的偏移地址,其实不需要offset啦,编译器在遇到offset 标号和直接标号的时候,都是翻译的是他们的 ...

我的实验结果不同啊,是不同的编译器解释不同造成的么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-10 17:33:33 | 显示全部楼层
把你代码发我,我去试一下,看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-10 18:40:31 | 显示全部楼层
assume cs:code  ds:data

data segment
    db 128 dup(0)
data ends


code segment
start:  

        mov ax,data
        mov ds,ax
       
        mov cx,128
a:        mov ax,1
s:     add ax,1
        loop s
       
        mov ax,offset a
        mov ax,a
       
        mov ax,4c00h
        int 21h

code ends
end start       
       

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

使用道具 举报

 楼主| 发表于 2012-12-10 18:41:16 | 显示全部楼层
lukelqz 发表于 2012-12-10 17:33
把你代码发我,我去试一下,看看

发了,你试试看。:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-10 19:11:24 | 显示全部楼层
会飞的熊 发表于 2012-12-10 18:41
发了,你试试看。

说两点,第一,你少了个逗号都能编译通过?
第二,我用的是MASM6.15,带ML编译的那个版本。运行结果和设想的完全一样。没有问题。
下面是我的调试图。
12.10.19.17.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-10 21:09:56 | 显示全部楼层
lukelqz 发表于 2012-12-10 19:11
说两点,第一,你少了个逗号都能编译通过?
第二,我用的是MASM6.15,带ML编译的那个版本。运行结果和设 ...

少了个逗号通过了编译,不过加了逗号结果还是一样的。
我用的是5.0,组合使用的masm和link ,应该是编译器的问题 ,我来下个6.15试试。 Image00002.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-10 21:15:24 | 显示全部楼层
会飞的熊 发表于 2012-12-10 21:09
少了个逗号通过了编译,不过加了逗号结果还是一样的。
我用的是5.0,组合使用的masm和link ,应该是编译 ...

恩。是编译器的问题,没必要在这个问题上深究了,知道自己要什么功能,该怎么用就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-10 21:22:21 | 显示全部楼层
lukelqz 发表于 2012-12-10 21:15
恩。是编译器的问题,没必要在这个问题上深究了,知道自己要什么功能,该怎么用就行了。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-27 04:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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