0
Я пытаюсь напечатать простую милую строку hello на консоли в встроенной сборке. Моя сборка (внизу) отлично работает. Я попытался перевести его в ГАЗ как можно лучше, но перенос переменных в регистры через расширенную сборку оказался довольно сложным. Из того, что я могу сказать, функция printmsg
фактически не выполняет/не печатает ничего.Распечатать сообщение Inline Assembly
Монтаж:
section .text
global _start
_start:
; Write string to stdout
mov eax, 4
mov ebx, 1
mov ecx, string
mov edx, strlen
int 0x80
; Exit
mov eax, 1
mov ebx, 0
int 0x80
section .data
string db 'Hello, World!',10
strlen equ $ - string
C:
#include <stdio.h>
#include <string.h>
void printmsg(char *msg, int len){
asm( "movl $4, %eax;"
"movl $1, %ebx;"
);
asm( "movl %1, %%ecx;"
"movl %1, %%edx;"
:
: "c" (msg), "d" (len)
);
asm("int $0x80");
}
int main(){
char *msg = "Hello, world!";
int len = strlen(msg);
printf("Len is %d\n*msg is %s\n", len, msg);
/* Print msg */
printmsg(msg, len);
/* Exit */
asm( "movl $1,%eax;"
"xorl %ebx,%ebx;"
"int $0x80"
);
}
Если вы не принимаете курс, и хотите узнать сборку, то Я рекомендую вам серьезно подумать об отсутствии _starting_ с встроенной сборкой. Это добавляет сложности, которые могут быть трудно понять, если вы новичок. Я бы рекомендовал создать ваш 'printmsg' в отдельном файле ассемблера, собрать его и связать с программой _C_. –
'printmsg' также должен работать с чем-то вроде:' void printmsg (char * msg, int len) { __asm__ ("int $ 0x80 \ n \ t" : : "a" (4), "b" (1), «c» (msg), «d» (len)); } ' –
Если вы используете gcc, базовый asm (т. Е. Asm без параметров) НЕ поддерживает изменение содержимого регистров, флагов или памяти (которые вы все еще делаете с помощью movl $ 4,% eax'). В то время как он будет компилироваться и может (как представляется) работать, в зависимости от этого неподдерживаемого поведения в конечном итоге приведет к сбоям, затрудняющим отслеживание. Лучше использовать расширенный asm, как предлагает Майкл выше. –