文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
5. 结构体
使用 struc ... endstruc
定义复合结构类型。
实际上 NASM 并没有结构体,而是以 macro 的方式实现。定义类型,以便重复使用。注意是
struc
,没有t
。
成员标签代表偏移量:省略成员时(
<type>
),偏移量为0
。添加后缀(<type>_size
),表示类型长度。
global _start struc user .name : resb 8 .age : resq 1 endstruc section .bss u : resb user_size ; sizeof(struct user) section .text _start: offset: mov rax, user ; 0 mov rbx, user.name ; 0 mov rcx, user.age ; 8 mov rdx, user_size ; 16 set: mov rax, "tom" mov rbx, 9 mov [u + user.name], rax mov [u + user.age] , rbx exit: mov rax, 60 xor rdi, rdi syscall
(gdb) b set (gdb) b exit (gdb) r Breakpoint 1, 0x0000000000401014 in set () (gdb) info registers rax 0x0 0 rbx 0x0 0 rcx 0x8 8 rdx 0x10 16 (gdb) c Breakpoint 2, 0x000000000040102e in exit () (gdb) x/2xg &u 0x402000 <u>: 0x00000000006d6f74 0x0000000000000009
使用 istruc
初始化变量,注意字段内容不能超出定义长度。
global _start struc user .name : resb 8 .age : resq 1 endstruc section .data u: istruc user at user.name, db "tom" at user.age, dq 9 iend n : equ $ - u ; user_size section .text _start: mov rax, n mov rbx, [u + user.age] exit: mov rax, 60 xor rdi, rdi syscall
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论