offset是汇编的伪指令, 功能是取得”标号”的偏移地址
例如, 以下程序对输出hello, world程序做调整
data segment
str db 'Hello, World!','$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
mov dx, offset str ; 相当于mov dx, 0, 或 lea ds:[0]
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
code ends
end start
在data字段中, 我们给定义的字符串, 起了一个名字str, 它也可以看作是一个标号
在这一小节中, 我们使用 mov dx, offset str 这条指令, 完成了 lea dx, ds:[0] 的功能( 你可以用lea去完成该指令功能 )
简而言之, 它能取得一个标号在其所在段的, 偏移的首地址, 我们再写一个做测试
data segment
str db 'Hello, World!','$'
str2 db 'Hai','$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
mov dx, offset str2 ; 相当于mov dx, 13
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
code ends
end start
调试该程序, 在这里得到的 dx, 为 000E, 也就是13,
那么反过来思考 lea 的作用是什么? lea dx, ds:[0]取的又是什么? 其实就是 0
而显示时, dx中存放的, 就是ds的偏移地址, 也就是说在使用21号中断的09号功能做显示字符串时, 默认输出的就是ds中的内容, 偏移地址从dx开始