Dorim să înțelegem rolul variabilelor globale și să învățăm cum le putem folosi.
Vom scrie programe în C pe care le vom compila folosind consola MINGW pentru a putea observa assembly-ul generat.
Deschideți consola MINGW. (C:\MinGW\msys\1.0\msys.bat
)
#include <stdio.h> int my_g = 1000; int main(void) { return 0; }
Pentru generarea fișierului assembly folosiți: gcc -S -O0 -masm=intel -o test.asm test.c
.
Observați următoarea secțiune:
.globl _my_g .data .align 4 _my_g: .long 1000
Adăugați, pe rând, câte o variabilă globală de tip char
, short
, long
și long long
.
Ar trebui să observați ceva similar cu:
.globl _my_hhg .data _my_hhg: .byte 10 .globl _my_hg .align 2 _my_hg: .word 100 .globl _my_g .align 4 _my_g: .long 1000 .globl _my_lg .align 4 _my_lg: .long 10000 .globl _my_llg .align 8 _my_llg: .quad 100000
Pentru început să ne uităm la un program simplu care se termină cu codul 2, pentru a putea observa structura generală a sintaxei.
NASM | GAS |
---|---|
; Text segment begins section .text global _start ; Program entry point _start: ; Put the code number for system call mov eax, 1 ; Return value mov ebx, 2 ; Call the OS int 80h | # Text segment begins .section .text .globl _start # Program entry point _start: # Put the code number for system call movl $1, %eax /* Return value */ movl $2, %ebx # Call the OS int $0x80 |
Principala diferență dintre NASM și GAS este sintaxa. GAS folosește sintaxa AT&T, o sintaxă arhaică specifică GAS și asambloarelor vechi, în timp ce NASM folosește sintaxa Intel, folosită de majoritatea asambloarelor cum ar fi TASM și MASM. Versiunile moderne de GAS suportă directia .intel_syntax
ce permite folosirea unei sintaxe Intel cu GAS. În exemplul din secțiunea anterioară, noi am forțat gcc
să folosească această directivă.
gcc folosește sintaxa GAS, însă sintaxa NASM este una mai ușor de înțeles și de folosit la început. Acesta este motivul pentru care la laborator noi folosim NASM.
Mai multe detalii aici.
Vom lua același exemplu în NASM (îl putem executa în SASM):
%include "io.inc" section .data my_g: dd 10 section .text global CMAIN CMAIN: PRINT_DEC 4, my_g ret