nasm汇编:段的申明、$$、$

段的申明:section Segment_Name align=0_? vstart=1_?
Segment_Name 表示段名
0_? 表示对齐的字节数
1_? 表示段内汇编地址的开始点
section.段名.start:获取段处的段地址与偏移地址(段地址:高地址2字节,偏移地址:低地址2字节)
缺省:未定义时的默认值
$$:值为vstart,当vstart未定义时(vstart缺省),默认值为所属段相对于程序开头的位置
$:值为vstart + 所在行与所在段的相对位移

section data0 ;程序开头地址:0x00000000,已对齐不需要align,缺省vstart值为它所属段的起始地址(此处为0x00000000)
db 0,0,0      ;地址0x00000000~0x00000002
db $$,$       ;地址0x00000003~0x00000004,$$=vstart=0x0,$=vstart+(所在行地址-所在段地址)=0x3
t0_:          ;指向上一行结束紧接着的下一个字节地址(vstart+0x00000005)
mov ax,t0_    ;地址0x00000005~0x00000006

section data1 align=16 ;段开头地址:0x00000010,align=16意味着段开头地址与最近的能整除16的位置为起始地址,缺省vstart值为它所属段的起始地址(此处为0x00000010)
db 0xa,0,0             ;地址0x00000010~0x00000012
db $$,$                ;地址0x00000013~0x00000014,$$=vstart=0x10,$=vstart+(所在行地址-所在段地址)=0x13
t1_:                   ;指向上一行结束紧接着的下一个字节地址(vstart+0x0000005)
mov ax,t1_             ;地址0x00000015~0x00000016

section data2 align=16 vstart=0x33 ;段开头地址:0x00000020,align=16意味着段开头地址与最近的能整除16的位置为起始地址,vstart值为0x33
db 0xa,0xa,0                       ;地址0x00000020~0x00000022
db $$,$                            ;地址0x00000023~0x00000024,$$=vstart=0x33,$=vstart+(所在行地址-所在段地址)=0x36
t2_:                               ;指向上一行结束紧接着的下一个字节地址(vstart+0x00000005)
mov ax,t2_                         ;地址0x00000025~0x00000026

section data3 align=16 vstart=0x55 ;段开头地址:0x00000030,align=16意味着段开头地址与最近的能整除16的位置为起始地址,vstart值为0x55
db 0xa,0xa,0xa                     ;地址0x00000030~0x00000032
db $$,$                            ;地址0x00000033~0x00000034,$$=vstart=0x55,$=vstart+(所在行地址-所在段地址)=0x58
t3_:                               ;指向上一行结束紧接着的下一个字节地址(vstart+0x00000005)
mov ax,t3_                         ;地址0x00000035~0x00000036

section exit align=16              ;段开头地址:0x00000040,align=16意味着段开头地址与最近的能整除16的位置为起始地址,缺省vstart值为它所属段的起始地址(此处为0x00000040)
db 0xa,0xa,0xa                     ;地址0x00000040~0x00000042
db $$,$                            ;地址0x00000043~0x00000044,$$=vstart=0x40,$=vstart+(所在行地址-所在段地址)=0x43
t4_:                               ;指向上一行结束紧接着的下一个字节地址(vstart+0x00000005)

总结
1、观察t0_,t1_,t2,t3,不难发现,vstart对其段内标号的作用
vstart未定义时,vstart缺省值为所在段起始地址,其内标号表示标号处相对于程序头的偏移
vstart定义为0时,其内标号表示标号处相对于其段的偏移
vstart定义为x时,其内标号表示x+标号处相对于其段的偏移
意味着vstart规定段内汇编起始地址,造成标号所表示位置不一定是其所处位置

vstart的另一种理解
vstart未定义时,所属段起始地址为真实段地址
vstart定义后,所属段起始地址为vstart
而$$始终代表所属段起始地址
于是有
vstart缺省时
vstart默认为段偏移
$$为所属段起始地址为段真实起始地址
段内标号表示的也都是真实地址(vstart(真实段偏移)+标号相对于段的偏移)
vstart定义时
所属段起始地址变为vstart
$$也就为vstart
段内标号表示的不一定都是真实地址(vstart(不一定为真实段偏移)+标号相对于段的偏移)
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值