nasm汇编:段的申明、$$、$
2024-04-26 14:07:04
段的申明: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~0x00000006section 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~0x00000016section 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~0x00000026section 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~0x00000036section 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(不一定为真实段偏移)+标号相对于段的偏移)
最新文章
- 【Python】解决print不能立即打印的问题
- (JAVA)CollectionDemo3
- Datawhale-零基础入门NLP-新闻文本分类Task03
- Linux 大文件快速处理小的办法
- vue-meta-info动态设置meta标签
- 5 月数据库排行:PgSQL 慢增长,MySQL冲击第一!
- java二进制流_java读写二进制流
- 树莓派专用msata硬盘转接板
- 计算机控制总线传输的是,总线,地址总线,数据总线和控制总线
- php个人微信聊天机器人,wxpy将个人微信号变成微信聊天机器人
- 【机器学习】监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
- 看完这篇文章,再也不怕别人问我JVM了
- 微信开挂怎么防止封号_再也不怕被封号!微信养号秘笈教你防封号防降权
- 【占星学】天蝎座女生性格特点
- 程控增益放大器电路原理图
- 靶机实战(bulldog)
- 解锁wp7手机实现真机调试
- android新特性:DrawerLayout与NavigationView配合使用
- Java课设对对碰_JAVA课程设计题目
- 安装:Python库的正确安装