asm基础——汇编中的结构体
来源:互联网 发布:单片机毕业论文论坛网 编辑:程序博客网 时间:2024/05/08 01:05
结构体的定义
在汇编中定义结构体的基本形式如下:
name STRUCT ;具体定义name ENDS
具体定义中可以包含以下的内容:
1. 未定义:用“?”表示
2. 字符串:用双引号包围
3. 整数:可以是常量或者表达式
4. 数组:使用DUP操作符来初始化数组
下面是一个例子:Employee STRUCTIdNumBYTE "000000000"; 9 个字节LastnameBYTE 30 DUP(0); 30 个字节YearsWORD ?; 2 个字节SalaryHistory DWORD 0,0,0,0; 16 个字节Employee ENDS; 共57个字节上面就是一个汇编结构体的定义,但是它存在一个小问题,即结构体中的某些成员并不是对称的,这在一定程度上回影响到CPU访问成员的速度,因此可以有以下的改进:
Employee STRUCTIdnumBYTE "000000000"; 9 个字节Reserved1BYTE 0; 增加一个字节,使Years能按双字节对齐</span></strong>LastnameBYTE 30 DUP(0); 30 个字节YearsWORD ?; 2 个字节Reserved2WORD 0; 增加两个字节,使SalaryHistory能按四字节对齐</strong></span>SalaryHistory DWORD 0,0,0,0; 16 个字节Employee ENDS; 共60个字节另外,还可以使用masm中的伪指令ALIGN来达到相同的目的:
Employee STRUCTIdnumBYTE "000000000"; 9 个字节LastnameBYTE 30 DUP(0); 30 个字节ALIGNWORD; 增加1个字节,使Years能按双字节对齐</span></strong>YearsWORD ?; 2 个字节ALIGNDWORD; 增加2个字节,使SalaryHistory能按四字节对齐</strong></span>SalaryHistory DWORD 0,0,0,0; 16 个字节Employee ENDS; 共60个字节
结构体变量的使用
下面是结构体的以下声明:.dataworker1EmpLoyee <>; 未初始化的结构体变量worker2Employee <"123456789"> ; 初始化了一部分成员的结构体变量worker3Employee <,"John">; 初始化了一部分成员的结构体变量2worker4Employee {, "Jack"}; 除了使用<>也可以使用{}workerCount = 10departmentEmployee workerCount DUP(<>); 结构体数组以及结构体的一般使用:
.codemain PROCmov worker1.SalaryHistory, 1000h; worker1.SalaryHistory本身就是一个内存地址了,所以可以直接传值mov eax, worker1.SalaryHistorymov ebx, OFFSET Employee.SalaryHistory ; 通过OFFSET可以得到成员在结构体中的便宜,注意这里需要使用Employee,而不能使用worker1mov ecx, TYPE Employee; 通过TYPE可以得到结构体的大小call DumpRegsexitmain ENDPEND main
另一个稍微复杂一点的例子:
.codemain PROCmov edi, 0; 数组偏移,第一次是0mov ecx, workerCount; 人数,表示的是循环次数mov eax, 1; 赋的初值,没有特殊意义L1:mov (Employee PTR department[edi]).Years, ax; 因为Years是WORD,所以这里需要使用ax,而不是eaxadd edi, TYPE Employee; 指向像下一个结构体loop L1 ; 根据ecx中的循环次数做循环,循环的时候会将ecx中的值减1exitmain ENDPEND main
1 0
- asm基础——汇编中的结构体
- asm基础——使用nasm进行汇编(基础)
- asm基础——使用nasm和bochs学习汇编
- asm基础——汇编指令之加减乘除指令
- asm基础——汇编指令之in/out指令
- asm基础——汇编指令之移位指令
- asm基础——汇编指令之比较测试指令
- asm基础——汇编指令之数据传送指令
- asm基础—— vs下使用汇编
- asm基础——汇编指令之ascii调整指令
- asm基础——vs下的反汇编
- x264中的汇编:x86inc.asm——001
- X264中的汇编:sad-a.asm——002
- x264中的汇编:cpu-a.asm——003
- x264中的汇编x86inc.asm
- x264中的汇编x86inc.asm
- x264中的汇编x86inc.asm
- asm基础——汇编指令之CPU的标识位操作指令
- Oracle 游标使用全解
- RabbitMQ消息分发模式----"Publish/Subscribe"发布/订阅模式
- mysql存储过程详解
- Android 基础 —— 活动的启动模式
- mysql如何让一个存储过程定时执行
- asm基础——汇编中的结构体
- 单链表找中间数
- scikit-learn入门到精通(三):监督学习
- Fragment填充ToolBar菜单
- oracle查看指定时间的数据(查看被删数据)
- oracle connect by用法
- ORACLE中null的排序问题
- SpringMVC之HandlerMethodArgumentResolver和<mvc:argument-resolvers>
- c#之枚举类型和int以及string类型的转换