NASM源代码分析之NASM中的指令表示(1)

本文介绍NASM汇编语言中指令的组成与表示方式,详细解释了指令的数据结构及两次汇编过程,包括如何处理标签、前缀、操作数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NASM源代码分析之NASM中的指令表示(1)

       在汇编语言中,一般将一条指令写成一行。一条指令有不同的组成部分,分别是:

1)  地址/变量标识(label),例如:startmov al,1中,start即为地址label

2)  指令前缀,包括 timesrepa32lock

3)  指令,如 movinc

4)  操作数,例如: mov ax,12 , 12即为操作数,在NASM中,最多有3个操作数。

 

表示指令的数据结构为:

typedef struct {                    /* an instruction itself */

    char *label;                   //标识(label)内容字符串

    int prefixes[MAXPREFIX];   // 前缀,最多4

    int nprefix;                      // 当前表示的指令的前缀个数

    int opcode;                       // 指令编号(每个指令都有一个数字编号)

    int condition;                  // 条件指令,对于诸如jne,je,setJccSETcc等形式的条件指令,则opcode=JccSETccconditions表示Jcccc的编号,例如指令jbeconditions=3

    int operands;                  // 操作数个数,dbdw之类不再此类限制,最多3个,[0,3]

operand oprs[3];             // 操作数编码

extop *eops;                  // 扩展操作数,例如用dbdw等定义的数

    int eops_float;            // 如果包含浮点数,则为true

    long times;                      // 重复次数,由前缀times定义,例如语句:times 4 db 100 times=4

    int forw_ref;                 // 操作数是否有前段引用

} insn;

 

NASM对源程序进行汇编,主要运行的函数是assemble_file(),对源程序进行2次汇编,其流程时:

       第一遍:主要确定代码中各label信息

1.       从源代码文件中读取一行代码:line=preproc->getline(),若结束,至4

2.       判断这个代码是否是NASM自带的汇编格式,若不是,跳至3

包括:

a)         [segment n] [section n]  定义段

b)        [extern label:special]  定义外部模块标识

c)        [bits n]  定义程序位数,0.98支持1632位,之后的版本还支持64位。

d)        [global symbol:special]  定义全局变量/标识

e)         [common symbol size:special]  定义common型变量,相当于在段.bbs中定义全局变量

f)         [absolute address]  定义绝对label

3.       调用parse_line()分析代码,跳至1

第二遍:

4.       从源代码文件中读取一行代码:line=preproc->getline(),若结束,至7

5.       判断这个代码是否是NASM自带的汇编格式,若不是,跳至3

包括:

a)         [segment n] [section n]  定义段

b)        [extern label:special]  定义外部模块标识

c)        [bits n]  定义程序位数,0.98支持1632位,之后的版本还支持64位。

d)        [global symbol:special]  定义全局变量/标识

e)         [common symbol size:special]  定义common型变量,相当于在段.bbs中定义全局变量

f)         [absolute address]  定义绝对label

6.       调用parse_line()分析代码,并将每行信息保存到结构output_ins中,并生成二进制内容输出到文件中,跳至4

7.       清理内存,退出。

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值