0
Satır içi montajdaki konsola basit bir merhaba dünya dizisi yazdırmaya çalışıyorum. Montajım (aşağıda) mükemmel çalışıyor. Bunu mümkün olduğu kadar iyi bir şekilde GAS'a çevirmeyi denedim, ancak değişkenleri genişletilmiş montaj yoluyla değişkenlere kaydetme oldukça zor oldu. Anlatabildiğim kadarıyla, printmsg
işlevi aslında hiçbir şey yapmıyor/yazdırmıyor.Yazdır İleti Inline Assembly
Montaj:
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: Michael genişletilmiş montaj örneği kullanarak
#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"
);
}
sonra, bir ders alarak ve montaj öğrenmek isteyen değilseniz Inline derlemeyle _starting_ öğesini ciddi olarak düşünmemenizi tavsiye ederim. Yeni olup olmadığını anlamak zor olabilecek karmaşıklıklar ekler. Printmsg'nizi ayrı bir assembler dosyasında oluşturmanızı, birleştirip _C_ programınıza bağlamanızı tavsiye ederim. –
'printmsg', aşağıdaki gibi bir şeyle çalışmalıdır: void printmsg (char * msg, int uzunluk) { __asm__ (" int $ 0x80 \ n \ t " : :" a "(4)," b "(1), "c" (msg), "d" (len)); } ' –
gcc kullanıyorsanız, temel asm (yani, parametreler olmadan), yazmaçların, bayrakların veya belleğin içeriğini değiştirmeyi desteklemez (bu işlem hala $ 4,% eax' ile yapılıyor). Bu, derlenecek ve çalışacak gibi görünse de, bu desteklenmeyen davranışa bağlı olarak, sonuç olarak, izlenmesi zor olan arızalarla sonuçlanacaktır. Michael'ın yukarıda belirttiği gibi genişletilmiş asm kullanmak daha iyidir. –