2010-02-01 16 views
7

używam devcpp i Borland C kompilator ....język prosty program "Hello World" Inline Assembly w C/C++

asm { 
    mov ax,4  // (I/O Func.) 
    mov bx,1  // (Output func) 
    mov cx,&name // (address of the string) 
    mov dx,6  // (length of the string) 
    int 0x21  // system call 
} 

w powyższych fragmentach kodu chcę wydrukować ciąg z pomocą asembler ... ale jak mogę umieścić adres ciągu w rejestrze cx ....

czy coś jest nie tak w kodzie?

+0

0x21 - wow kudos za zapoznanie się z podstawami :-) –

+0

Jak przechowywany jest ciąg? tj .: jaka jest deklaracja "nazwa"? – GManNickG

+4

Proponuję zignorować 16-bitowy asembler w trybie rzeczywistym i zacząć bezpośrednio od 32-bitowego asemblera. W dzisiejszych czasach jest to znacznie łatwiejsze i bardziej praktyczne. –

Odpowiedz

4

nie mam kompilatora Borland pod ręką, więc może być misremembering jego składni, ale czy próbował to:

asm { 
    mov ax,4  // (I/O Func.) 
    mov bx,1  // (Output func) 
    lds cx,"Hello, world" // (address of the string) 
    mov dx,6  // (length of the string) 
    int 0x21  // system call 
} 

lub to:

char msg[] = "Hello, world"; 

asm { 
    mov ax,4  // (I/O Func.) 
    mov bx,1  // (Output func) 
    lds cx, msg // (address of the string) 
    mov dx,6  // (length of the string) 
    int 0x21  // system call 
} 

edit: chociaż to się skompiluje (teraz, gdy zmieniłem MOV na LDS), nadal będzie wyświetlał błąd w czasie wykonywania. Spróbuję jeszcze raz ...

+1

no it doesnt work ... daje błąd ........ czy istnieje inny sposób, dzięki któremu mogę uzyskać adres ciągu .. i umieścić go z powrotem do rejestru cx .... – vs4vijay

+0

Z tego co wiem, 'mov cx, msg' umieszcza adres' msg' w rejestrze 'cx'. Co dostajesz? – Jack

+0

@ vs4vijay Nie powinieneś akceptować niedziałającego rozwiązania jako odpowiedzi, ponieważ jest to błąd. – ST3

2

Wystarczy umieścić nazwę zmiennej tam:

mov ax,4  // (I/O Func.) 
mov bx,1  // (Output func) 
mov cx,name // (address of the string) 
mov dx,6  // (lenght of the string) 
int 0x21  // system call 

Oświadczenie: Nie jestem zbyt dobry w montażu.