Como você pode descobrir quais registros são usados para chamadas do sistema? [fechadas]

1

Como você sabe quais registros você precisa usar para as chamadas do sistema? Isto é para cada máquina diferente? Então, por que é eax, ebx, etc? Como posso descobrir minha máquina? Será diferente para cada processador, quero dizer, haverá uma diferença para i586 e i386?

_start:             ; entry point for commands

         ; use the write syscall to print 'Hello world!' to stdout
         mov eax, 4          ; move syscall 4(write) to the eax register
         mov ebx, 1          ; move field descriptor for stdout to ebx
         mov ecx, msg        ; move the memory address of our string to ecx
         mov edx, 13         ; move the length of the string to edx
         int 0x80       ; execute the syscall

    section .data
         msg: db “Hello world!”, 0x0a  ; the string, followed by a new line character
    
por Joey 30.11.2015 / 19:00

1 resposta

2

Cada arquitetura define um "ABI" (interface binária do aplicativo) que basicamente diz "o primeiro argumento vai aqui, o segundo vai aqui, o terceiro vai aqui ... o valor de retorno volta aqui". Você leu a especificação da ABI e, em seguida, usa a ordem e o tamanho dos argumentos de uma função para determinar em qual registro eles vão.

Veja link

Você precisará gerar uma montagem diferente para cada plataforma que deseja segmentar. Mas, você pode estar razoavelmente certo de que todas as plataformas "Linux x86_64" são compatíveis com binários, e assim por diante para x86, ARM, PowerPC, etc. Mas também há o BSD: -)

Veja algumas folhas de dicas para x86 e x86_64 (extraídas de uma rápida pesquisa no google)

Mas também cuidado que os próprios números syscall variam entre as plataformas , então 'open' no x86_64 é 3 mas no x86 é 5.

    
por 01.12.2015 / 05:21