#2 Le 16/02/2016, à 23:34
- derderder
Re : Assembleur en X86 avec NASM sur du intel i386
Première chose, copie colle ton message d'erreur dans des balises code plutôt que de faire un screenshot. Deuxième chose, poste ton code, ma boule de cristal ne marche pas toujours bien. Troisième chose, exporte principal en tant que symbole global.
En nasm:
[GLOBAL principal]
En gas:
.global principal
Hors ligne
#3 Le 17/02/2016, à 11:54
- salax96
Re : Assembleur en X86 avec NASM sur du intel i386
Voici le prog :
; monProg.asm
global main
section .text
main:
nop ; ne fait rien
mov eax, 234
mov al, -1
mov ah, 0xA2
mov bx, 0xA2FF ; bx possède la même valeur que ax
mov ecx, 123456
mov dh, 100q
mov dl, 10001010b
mov ah, 0x0B ; on écrase l'ancien contenu de ah
mov al, -130
mov al, 'd' ; al reçoit le code ASCII du caractère 'd'
; mov eip, 0 ; erreur de compilation : eip inaccessible
; fin
mov eax, 1
mov ebx, 0
int 0x80
Message d' erreur :
g4200@g4200-VirtualBox:~/Téléchargements$ ls
monProg monProg.asm monProg.o
g4200@g4200-VirtualBox:~/Téléchargements$ ld -o monProg -e principal -m elf_i386 monProg.o
ld: AVERTISSEMENT: ne peut trouver le symbole d'entrée principal; utilise par défaut 0000000008048060
g4200@g4200-VirtualBox:~/Téléchargements$
Merci pour ton aide
Modération : merci à l'avenir d'utiliser les balises code (explications ici).
Dernière modification par cqfd93 (Le 17/02/2016, à 17:19)
Hors ligne
#4 Le 17/02/2016, à 14:08
- Nasman
Re : Assembleur en X86 avec NASM sur du intel i386
Je ne sais pas si cela va t'aider mais j'avais fait quelques petits test de programmes assembleur 32 et 64 bits avec Nasm.
Les voici:
Version 32 bits
; 32-bit sys_write call in NASM
; nasm -f elf32 -o HelloWorld_32bits.o HelloWorld_32bits.asm
; ld -o HelloWorld_32bits HelloWorld_32bits.o
global _start ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, message ; message address (defined in the .data section)
mov edx, length ; message string length (also in .data)
int 80h ; 32-bit syscall
; sys_exit(return_code)
mov eax, 1 ; sys_exit syscall
mov ebx, 0 ; return 0 (success)
int 80h
section .data
message: db 'Hello, world!',0x0A ; message and newline
length: equ $-message ; NASM definition pseudo-instruction
Version 64 bits
; 64-bit "Hello World!" in Linux NASM
; nasm -f elf64 -o HelloWorld_64bits.o HelloWorld_64bits.asm
; ld -o HelloWorld_64bits HelloWorld_64bits.o
global _start ; global entry point export for ld
section .text
_start:
; sys_write(stdout, message, length)
mov rax, 1 ; sys_write
mov rdi, 1 ; stdout
mov rsi, message ; message address
mov rdx, length ; message string length
syscall
; sys_exit(return_code)
mov rax, 60 ; sys_exit
mov rdi, 0 ; return 0 (success)
syscall
section .data
message: db 'Hello, world!',0x0A ; message and newline
length: equ $-message ; NASM definition pseudo-instruction
PC fixe sous Bionic 64 bits et portable avec Focal 64 bits
Hors ligne
#5 Le 17/02/2016, à 17:16
- derderder
Re : Assembleur en X86 avec NASM sur du intel i386
Ton problème est simple, tu dis au linker de prendre comme entrée le symbole "principal", or ce dernier n'existe pas. Tu dois soit renommer le "main" de ton programme en "principal", soit ( ce que te conseille de faire ) passer -e main au linker pour dire que l'entrée de ton programme est le symbole main.
Hors ligne