当前位置: 汇编教程 > 04-转移指令 > 阅读正文

汇编 伪指令offset

2021.7.12.   1071 次   703字

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开始

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群