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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果id锁变砖头怎么办 钥匙断在锁里了怎么办? u型锁忽然打不开怎么办 密码门锁没电了怎么办 智能门锁没电了怎么办 十字锁钥匙丢了怎么办 罐头的拉环断了怎么办 锁坏了 打不开了怎么办 门锁锁不起来了怎么办 卧室门锁舌断了怎么办 锁舌头坏了怎么办自救 门锁斜舌头断了怎么办 锁把手断了半截怎么办 门锁那一块掉了怎么办 qq动态密码忘了怎么办 小三怀孕了原配该怎么办 我当了小三怎么办 被降职后在单位怎么办 领导故意整我该怎么办 小孩怎么教育都不听怎么办 赵本山怎么办的刘涌 起诉离婚被告不出庭怎么办 安装u盘进入系统怎么办 思讯加密狗坏了怎么办 村主任选不出来怎么办 你的id已被停用怎么办 车牌摇号中签后怎么办 北京车卖了指标怎么办 车的电脑板坏了怎么办 饭卡消磁了怎么办妙招 有好项目没资金怎么办 买的股票涨停了怎么办 考研没过国家线怎么办 中石化的油卡怎么办 5173号被找回了怎么办 谭木匠梳子断了怎么办 198地块上的企业怎么办 天猫投诉不成立怎么办 顾客老嫌瓷砖贵怎么办 公司的公章丢了怎么办 物业不给充电费怎么办