Assembly ebx regiszter - seg fault
2019-04-14T23:03:43+02:00
2019-04-15T01:35:47+02:00
2022-08-11T11:50:30+02:00
zox1_
Sziasztok,

Egy kis felvilágositásra lenne szükségem.
Debain 9, GNU GAS gcc hasznalok.
Assembly-be irnák egy függvényt, amit C-ben megirt main fgv-bol meghivnak.

Itt a asm kod:

.intel_syntax noprefix
.data
formatstr:
.asciz "ez a myprintf: %d\n"
msize:
.int 3

.text
.global proba
proba:
push ebp
mov ebp, esp

mov ebx, msize

push ebx
push offset formatstr
call printf

add esp, 2*4

mov eax, 0
mov esp, ebp
pop ebp
ret

Itt a C kod:
#include <stdio.h>

int proba();

int main(int argc, char const *argv[]) {
/* code */
printf("My Function \n\n");
int res = 0;

res = proba();
printf("proba() - result: %d\n\n", res);
printf("The End \n\n");

return 0;
}

Ez igy Seg Fault-al elszall. Ez az eredmény:
My Function
ez a myprintf: 3
Segmentation fault

Ha az asm kodban az ebx-t lecserélem eax-re, akkor minden OK.
My Function
ez a myprintf: 3
proba() - result: 0
The End


Ha az asm kodban marad az ebx es proba-t lecsereéem main-ra, leforditom, akkor hiba mentes.
Mit rontok el?
Előre is köszönöm a segítséget.
zox1_
Mutasd a teljes hozzászólást!
Megkeresheted a Linux vonatkozó specifikációját, de az általános Intel "szabály" szerint az EAX, ECX és EDX regiszterek piszkálhatóak szabadon, a többit vissza kell állítanod a hívás előtti értékre (x86 calling conventions - Wikipedia, the free encyclopedia ). Szóval ha EBX-et szeretnél használni, akkor pl. használat előtt mentsd el a verembe, utána meg pop-old vissza.
Mutasd a teljes hozzászólást!

abcd