[0xb] nasm汇编 [结构体]

在C语言中使用struct声明结构体,而在nasm汇编中,也可以使用结构体,通过使用伪指令来声明结构体。下面的struc代码展示了如何在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,如果获得high的值,则使用[xiaoming + high],在汇编中,要形成这样的概念:标号一般都表示地址,而要取地址处的值,则使用中括号[]。

使用printf函数打印name和high,还记得哪些寄存器作为调用参数吗?rdi, rsi, rdx, rcx, r8和r9。

最后,我们调用了系统调用exit,系统调用号为60,退出程序。

 

汇编中,似乎用到结构体的地方不多,尤其在反汇编分析程序的时候,高级语言中的结构体变量存放在内存中,使用偏移量来获取成员变量的地址,能够分析出结构体的代码,已经很不容易了。

 

你可能感兴趣的:(汇编,nasm汇编)