返回介绍

5. 结构体

发布于 2024-10-13 10:58:56 字数 1502 浏览 0 评论 0 收藏 0

使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文