2015-11-25 2 views
1

J'écris un programme nasm qui imprime simplement une chaîne en utilisant les directives et les macros du préprocesseur. Voici le code:Erreurs dans le code qui essaie d'afficher des chaînes

%define hello "Hello, world!" 
%strlen size_h hello 

%macro print 2 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, %1 
    mov edx, %2 
    int 80h 
%endmacro 

section .text 
global _start 

_start: 
    print hello, size_h 
    mov eax, 1 
    mov ebx, 0 
    int 80h ;exit 

J'utilise l'éditeur de liens ld.

Il me montre deux avertissements:

character constant too long 
dword data exceeds bounds 

Comment puis-je corriger cela?

Répondre

1

La macro remplace simplement les chaînes. Alors, print hello, size_h deviendra

mov eax, 4 
mov ebx, 1 
mov ecx, "Hello World!" 
mov edx, 13 
int 80h 

Vous voyez, vous essayez de charger ECX avec une chaîne, depuis une adresse Int 80h/EAX=4 attend. Vous devez d'abord stocker la chaîne, puis vous pouvez charger ECX avec son adresse. NASM ne le fera pas pour vous.

stocke macro suivant le littéral dans la section .text (vous ne pouvez pas changer là-bas):

%macro print 2 
    jmp short %%SkipData 
    %%string: db %1 
    %%SkipData: 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, %%string 
    mov edx, %2 
    int 80h 
%endmacro 

Cette macro passe à la section .data et retour à .text:

%macro print 2 
    section .data 
    %%string: db %1 
    section .text 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, %%string 
    mov edx, %2 
    int 80h 
%endmacro 
+0

Grande ! Merci beaucoup! – sant016