1. Variabile globale

Dorim să înțelegem rolul variabilelor globale și să învățăm cum le putem folosi.

C to Assembly

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)

test.c
#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

Observați că sintaxa este asemănătoare, dar diferită față de ce ați folosit până acum în laborator.

NASM vs. GAS

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.

NASM

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
iocla/cursuri/capitol-07/demo/01.txt · Last modified: 2016/11/23 12:48 by laura.vasilescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0