Partage
  • Partager sur Facebook
  • Partager sur Twitter

l'assambleur avec windows est ce que ca marche ?

clavier qwerty :p

    27 juillet 2024 à 16:45:11

    hello world !
    après avoir passer un temps considerable a pratiquer du C je me suis maintenant plonger dans l'assembleur !
    j'ai lu pas mal de tuto concernant les bases (sys de numeration, cpu, registes...) apres cela quand le moment de la pratique est arriver j'ai remarquer que tout les tuto que je suivais c'etait sur linux (meme ceux en anglais) !
    par exemple ce code:
    section .data
    
    section .text
    global _start
    
    _start:
            mov eax, 1
            mov ebx, 1
            int 80h
    l'equivalent en C:
    int main()
    {
        return 0;
    }
    normalement quand je lance le programme et qu'apres j'afficher la valeur de return avec echo %errorlevel% ca donne 0
    mais avec l'assambleur ca donne une autre valeur a chaque fois (presque) et pas 0
    pourtant j'ai bien assambler:
    nasm -f win32 main.asm -o main.o
    ld -m i386 -o main.exe main.o
    j'ai meme essayer avec avec une structure de code 64bit:
    section .text
    
    global _start
    
    _start:
            mov rax, 60 ; syscall number for exit
            mov rdi, 0  ; exit status
            syscall
    et aucun resultat
    mais j'ai installer ubuntu grace au WSL(windows subsystem for linux) quand j'affiche la valeur de retour avec echo $?
    ca ne marche qu'avec la structure de code 64bit et ca n'execute pas le 32bit avec l'erreur "-bash: ./main: cannot execute binary file: Exec format error"
    du coup je cherche de l'aide pour windows ou bien avec la WSL m'aider a comprendre pourquoi ca n'execute pas des executable 32bit alors que mon processeur est 64bit, merci.
    • Partager sur Facebook
    • Partager sur Twitter
      29 juillet 2024 à 11:37:26

      En cherchant un peu, je tombe rapidement sur ce sujet SO qui parle des valeurs de sortie https://stackoverflow.com/questions/70511327/setting-exit-status-in-nasm-for-windows

      Pour résumé, sur "windDos" c'est int 0x21 et pas int 0x80; (je recopîe ci-dessous les codes de la page SO)

      segment code
      
      start:
          mov ah, 0x4C   ; function `exit – terminate with return code`
          mov al, 52     ; return code
          int 0x21       ; DOS kernel interrupt


      ou alors faire

      global start
      
      extern _ExitProcess@4
      
      section .text
      
      start:
          push 52         ; pour retourner 52 en code de sortie
          call _ExitProcess@4



      • Partager sur Facebook
      • Partager sur Twitter
        30 juillet 2024 à 2:02:15

        Je ne code plus en assembleur depuis longtemps.

        J'ai tout de même eu la curiosité de savoir ce que ça donne avec mon compilateur:

        -

            .file    "ab.c"
            .text
            .def    __main;    .scl    2;    .type    32;    .endef
            .globl    main
            .def    main;    .scl    2;    .type    32;    .endef
            .seh_proc    main
        main:
            pushq    %rbp
            .seh_pushreg    %rbp
            movq    %rsp, %rbp
            .seh_setframe    %rbp, 0
            subq    $32, %rsp
            .seh_stackalloc    32
            .seh_endprologue
            call    __main
            movl    $0, %eax
            addq    $32, %rsp
            popq    %rbp
            ret
            .seh_endproc
            .ident    "GCC: (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 10.2.0"
        -

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

        l'assambleur avec windows est ce que ca marche ?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        • Editeur
        • Markdown