OFFSET 其实用起来很简单的,一般就是用来获得标号处相对于程序段其实位置的偏移地址。
MOV AX,OFFSET SUB,把SUB所在的偏移地址传送到AX中
JMP SUB1其实等同于 JMP OFFSET SUB1
总的来说OFFSET的功能就是去的标号所在的偏移地址,与其相对应的是标号SEG
SEG是取得标号所在的段地址
assume cs:code
table dw offset s,seg s ;这里用数据标号存放两个字,低位字存放S偏移地址,高位字存放S的段地址。下面用JMP 跳转到S处得标号
code segment
start:
jmp dword ptr table[0];段间转移
db 128 dup (0)
s: mov ax,4c00h
int 21h
code ends
end start
这里有三个概念 你需要明白 1 物理地址 2逻辑地址(有效地址)
3偏移地址
在80x86里 总线接口部件BIU 提供了16双向数据总线 20位地址总线
8086最大寻址1MB的存储空间 但是在CPU 内部寄存器结构都是16位 显然不能满足20位的地址寻址要求 所以就将1MB的空间 划分出若干个逻辑段 每个段最大位64KB 段用一个段地址来标识 段寄存器就是用来存放段的起始地址的 因此 物理地址 有段地址 和 段内偏移量地址两部分组成
有效地址是这样表示的:xxxx:yyyy 前四位是段的起始地址 后四位是 在本段内的偏移地址 就是偏移量 这就是逻辑地址
而物理地址是20位的 它是怎样得到的呢?
使段地址左移一位 这样就成了xxxx0 然后在加上yyyy 这个偏移地址
就得到了 所谓的物理地址了 这样就得到了公式:
物理地址=段地址16(就是相当于左移一位)+偏移地址;
这样说 明白嘛??
呵呵,我帮你认真的解释一下:
TABLE DW 10,20,30,40,50
;第一句的解释:定义以TABLE为首地址的五个数据; DW指字类型,就好像C语言的基本类型
的功能一样,前面的TABLE则是标识符。
ENTRY DW 3
;第二句的解释:道理同上,看懂一的解释二应该也清楚了。
MOV BX,OFFSET TABLE
;第三句的解释:意思是将TABLE的首地址传送给基址寄存器BX,OFFSET +X符识符,
表示取X的首地址,整个语句的寻址方式为立即数寻址,MOV在这语句中
起传送地址的作用此时BX=TABLE(表示地址)
ADD BX,ENTRY
;第四句的解释:BX = BX+0003H =TABLE+3(0003H是3的十六进制也没什么区别)
MOV AX,[BX]
;第五句的解释:BX是一个寄存器,加上"[BX]"就是BX(从上面我们可以看出BX寄存器里面是地址) 这个地址里包含的内容,些时BX=TABLE+3而[TABLE+3]的内容就是1E00H传送给AX
如果看懂上面的文字后,就可以分析AX为什么是1E00H了:
TABBLE的数是这样的存储的:
10——>000AH 逻辑存储——>0A (TABLE+0)位
20——>0014H 00 (TABLE+1)位
30——>001EH 14 (TABLE+2)位
40——>0028H 00 (TABLE+3)位
50——>0032H 1E (TABLE+4)位
00 (TABLE+5)位
。。。 。。。。
从第五句我们可以看到:
AX=[BX]=[TABLE+3]
而汇编有这样的规定,以低位表示一个字,那么加上高位 (TABLE+4)就组成了一个字了,
而[TABLE+4]单元里的内容是:1EH,则高位与低位一同组成字故AX=1E00H。
说明:在以上的解释过程中用"="即等号只是为了表达简洁而以,汇编中没有等号直接写的。
我感觉整个过程解释的蛮详细了,不知道你看明白了吗?呵呵
以上就是关于哪位汇编高手指点下小弟offset的功能,最好能详细点,小弟感激不尽!~全部的内容,包括:哪位汇编高手指点下小弟offset的功能,最好能详细点,小弟感激不尽!~、汇编语言中有效地址和偏移地址的区别、汇编中的offset等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)