Sprawdzenie kodu ASM

0

hej, wczesniej tu pytalem o uzycie funkcji z c w assembly ale juz rozwiazalem ten problem i skonczylem program, chce tylko zebyscie sprawdzili czy wszystko jest jak nalezy czy moze powinienem dodac jakiś push albo pop ? dobrze wszystko wrzucilem i zdjalem ze stosu ? Na przyklad nie rozumiem po co wrzucam tutaj na stos EBC a potem go z niego zdejmuje, znajomy polecil to dodac bo 'tak wymaga konwencja C, bo jestem w C mode' ale nie rozumiem po co to, umialby ktos wyjasnic ?

  .equ BUFFER_SIZE, 32
 
  .text
  .global main
main: 
        movl $3, %eax
        movl $0, %ebx
        pushl %ebx
        movl $buffer, %ecx
        movl $BUFFER_SIZE, %edx
        int  $0x80

        cmpb  $'A', buffer
        jne dalej
  
        pushl $a_string
        call printf
        popl %eax
        int  $0x80

        popl %ebx
        xor %eax, %eax
        ret

dalej:
        pushl $b_string
        call printf
        popl %eax       
        int  $0x80      

        popl %ebx       
        xor %eax, %eax
        ret
  
  .bss
        .lcomm buffer, BUFFER_SIZE
  
  .data
a_string:
        .ascii "A string\0"
b_string:
        .ascii "B string\0"
0

Jeśli korzystasz z int 80h to nie pushujesz parametrów, tylko przekazujesz przez rejestry.
Z początku pushujesz 0 tylko po to by je potem zdjąć - bez sensu.
cmpb $'A', buffer Nie jestem pewien jak to działa w GNU As, tzn czy porównujesz adres, czy zawartość spod tego adresu.
A tak to zbyt dużo tego nie ma, więc z grubsza jest dobrze.

Ale pare rad.
Albo wołasz funkcje biblioteczne, albo systemowe API.

  • Jeśli korzystasz z API parametry idą via stos rejestry i zapominasz o wszelakich konwencjach wywołania bo tam ich nie znajdziesz.
  • Jeśli korzystasz z funkcji bibliotecznych zważaj na konwencje wywołania ale nie korzystaj z int 80h bo akurat call mówiąc prosto, jest sam w sobie takim int 80h gdyż w środku, czyli swojej implementacji, prawdopodobnie i tak wywołuje on ów systemowe API

A na koniec, gorąco polecam zmiane assemblera, bo ten ma chorą składnie.
// Btw. używanie cdecl "poleciłem" ci w poprzednim twoim temacie XD to co walisz scieme że znajomy?

0

wtedy jeszcze nie wiedzialem ze cdecl wymaga tego pushowania ebx, najpierw pushowac polecil mi to znajomy, potem wyjasnil ze to chodzi o cdecl i teraz ogarnalem o co chodzi z tymi konwencjami, kod wyglada juz prawidlowo.A tak jak wspomnialem w poprzednim temacie, składnia at&t podoba mi się bardziej od intela dlatego wybrałem assembler gnu, i nie zamierzam póki co zmieniac, chora składnia moze jest dla ciebie, mi sie podoba.

  .equ BUFFER_SIZE, 1
  
  .text
  .global _start
_start: 
        movl $3, %eax
        movl $0, %ebx
        movl $buffer, %ecx
        movl $BUFFER_SIZE, %edx
        int  $0x80

        cmpl $0, %eax
        je wyjscie
        cmpb $10, buffer
        je _start
        cmpb  $'A', buffer
        jne dalej
  
        movl $a_string, %ecx
        movl $len, %edx
  
        jmp dalej1

dalej:
        movl $b_string, %ecx
        movl $len, %edx
  
dalej1:
        movl $4, %eax
        movl $1, %ebx
        int  $0x80

wyjscie:
        xor %eax, %eax  
        movl $1, %eax
        movl $0, %ebx
        int  $0x80
  
  .data
        .lcomm buffer, BUFFER_SIZE

a_string:
        .ascii "A string"
b_string:
        .ascii "B string"
  
        len = . - b_string

1 użytkowników online, w tym zalogowanych: 0, gości: 1