[0 xb]nasmアセンブリ[構造体]


C言語ではstructを使って構造体を宣言しますが、nasmアセンブリでは構造体を使って疑似命令を使って構造体を宣言することもできます.下のstruucコードは、nasmアセンブリに構造体を使用する方法を示しています.
; struc.asm  ubuntu 64
; compile: nasm -f elf64 -o struc.o struc.asm
; link:    gcc -o struc struc.o
; run: ./struc

extern printf
section .data
    fmt: db 'name = %s, high = %ld', 0xa, 0xd, 0
struc people
    name: resb 20
    high: resq 1
endstruc

xiaoming:
istruc people
    at name, db 'xiaoming', 0
    at high, dq 0xaf
iend

section .text
global main
main:
    mov rdi, fmt
    mov rsi, xiaoming + name
    mov rdx, qword [xiaoming + high]
    mov rax, 0
    call printf

    mov rax, 60
    syscall
データセグメントでは、STRUCとENDSTRUCダミーコマンドを使用して構造体peopleを宣言し、peopleには2つのメンバー変数があり、nameとhigh、nameはバイトタイプで、長さは20、highはqwordタイプ、つまり8バイトがあります.
そして、データセグメントでは、peopleの変数xiaomingを宣言しました.ここでは、疑似コマンドistrucとiendを使用して、atはマクロ(MACRO)であり、メンバー変数のポインタを位置付けし、その後、メンバー変数を割り当てます.
コードセグメントで構造体の変数xiaomingを使用する場合、xiaomingはラベルであり、一つのアドレスを表し、nameのアドレスを取得する場合はxiaoming+nameを使用し、高揚値を取得する場合は[xiaoming+high]を使用し、アセンブリでは、このような概念を形成する.
printf関数を使ってnameとhighをプリントしますが、どのレジスタを呼び出しパラメータとして覚えていますか?rdi,rsi,rdx,rx,r 8およびr 9.
最後に、システムの呼び出しを行いました.システムの呼び出し番号は60で、プログラムを終了します.
 
アセンブリでは、構造体を使うところは多くないようです.特に、アセンブラ分析プログラムの場合、高度な言語の構造体変数がメモリに保存されています.オフセットを使ってメンバー変数のアドレスを取得して、構造体のコードを解析することができます.