2016-09-17 8 views
4

리얼 모드에서 C 프로그램을 작성하고 있습니다. 프로그램은 0x2000:0x0000 주소로로드되어 실행됩니다. DS 레지스터는 CS이고, 이는 0x2000입니다. 또한 나는 bochs로 디버깅을하고있다.BCC (Bruce 's C Compiler)의 인라인 어셈블리 - C 변수 사용 방법

제 목표는 화면에 텍스트를 인쇄하는 것입니다. 인라인 어셈블리 (BIOS INT 10h)가 필요합니다.

나는이 명령으로 컴파일
asm("jmp _main"); 

void putchar(c) char c; 
{ 
    asm("mov ah, 0x0e"); 
    asm("mov al, c"); 
    asm("xor bx, bx"); 
    asm("int 0x10"); 
} 

void main() 
{ 
    asm("push cs"); 
    asm("pop ds"); 
    putchar('A'); 
    for(;;); 
} 

...

bcc -W -0 -c test.c -o test.obj 

... 그것은 일하고 :

여기 내 테스트 파일입니다.

undefined symbol: c 

왜 이런 일이 : 내가 함께 ... 그것을 연결하기 위해 노력하고있어하지만

ld86 -d isimsiz.obj -o kernel.bin 

... 그것은 나에게 오류를 준? BCC 인라인 어셈블리에서 C 변수를 사용하려면 어떻게해야합니까?

BCC에 관한 유용한 자습서를 알고 있다면 링크를 남겨 두십시오. 나는 인터넷 :(사전에

덕분에 그것을 찾을 수 없습니다

PS를 :. 여기에 각각의 compiler BCClinker LD86의 맨 페이지는

+0

나는 또한 언급을 잊었다. 숨은 참조에 대한 훌륭한 자습서를 알고 있다면 링크를 남겨주세요. 나는 인터넷에서 찾을 수 없었다 :(미리 감사드립니다. –

+0

'putchar'와 같은 줄에 그리고 typeless 변수'c'로 선언 된'char c; '는 무엇인가요? 실수로 비표준 문법을 사용합니다.) void putchar (char c) – enhzflep

+1

@enhzlep BCC는 K & R 문법을 사용하므로 매개 변수는 정확합니다 –

답변

6

숨은는 C 변수를 참조 지원하지 않습니다. __FIRST_ARG_IN_AX__가 정의되어있는 경우

void putchar(c) 
{ 
#asm 
    mov ah, 0x0e 
    mov bx, sp 
    mov al, [bx+2] 
    xor bx, bx 
    int 0x10 
#endasm 
} 

또한 확인 할 수 있습니다 :. 당신은 어셈블리의 전체 기능을 쓸 필요가

,
void putchar(c) 
{ 
#asm 
    mov ah, 0x0e 
#if !__FIST_ARG_IN_AX__ 
    mov bx, sp 
    mov al, [bx+2] 
#endif 
    xor bx, bx 
    int 0x10 
#endasm 
} 

R 형식의 함수에서 함수 매개 변수의 형식은 int보다 좁을 수 없으므로 void putchar(c) char c;은 구문 상 올바르지 만 사용자는 그렇게 할 수 없습니다. 덧붙여서 libc 함수 putcharint이라는 인수를 취합니다.

unsigned equipment; 
int has_floppy() { 
#asm 
    int 0x11 ! get BIOS equipment list 
    mov _equipment,ax 
#endasm 

    return (_equipment & 1); 
} 
} 

당신은 숨은에서 인라인 어셈블리에 대한 예제의 dev86 libc 볼 수 있습니다 :

당신이 정말로, 변수를 사용하여 전역 변수를 사용하는 것을 고려해야 할 경우

.

+0

고마워요. K & R 구문에 대한 자습서를 알고 있습니까? 링크일까요? –

+1

@ B.Kaan 자신에게 초판 K & R을하십시오. 또는 C 표준을 읽으십시오. – fuz

+0

나는 그것을 내 마음 속에 간직 할 것이다. –