2013-07-13 2 views
-2

어셈블리를 배우고 있으며 32 비트 Linux에서 16 비트 읽기 모드 코드를 실행할 수 없다는 것을 알게되었습니다. 32 비트 Linux에서 16 비트 코드를 실행하려면 적절한 환경을 설정해야합니다.DOSBOX에서 printf 함수를 사용하는 방법

그래서 우분투에 DOSBOX를 설치했고 16 비트 코드를 실행할 수 있었지만 지금은 또 다른 문제가 있습니다. DOSBOX의 printf 기능을 사용하고 싶습니다. 아래는 코드입니다

section .data 
x dw "value is =%d" 

section .text 
extern printf 
global main 

main: 
    push x 
    call printf 
    add sp,2 
    ret 

하지만이 코드를 어셈블 할 때, 나는 아래의 오류가 점점 오전 : 이제

binary output format does not support external references 

난에 printf 전화를 할 수있는 적절한 방법이 무엇인지 알고 싶습니다 DOSBOX 환경.

+3

'printf'는 DOS에없는'libc'의 일부입니다. 자신 만의'printf' 구현체를 작성하거나 DOS와 어셈블러에서 작동하는 것을 찾아야합니다. – Michael

+0

그리고'printf'가 사용 가능하다면, 포맷 스트링을 넘겨 줘야하므로 충분한 매개 변수를 전달하지 못하고 포맷 스트링에 필요한 정수 값은 전달하지 못합니다. – lurker

+1

DOS 용 C 컴파일러 (또는 적어도 stdlib)가 필요하다고 생각됩니다. 일부는 [FreeDOS devel page] (http://www.freedos.org/software/?cat=devel)에서 링크됩니다. –

답변

3

이 상황에서 가장 좋은 조언은 16 비트 리얼 모드 코드 작성을 중단하는 것입니다. 어셈블리 언어를 배우려고하면 32 비트 보호 모드 환경에서 작업하는 것이 더 쉽습니다.

원하는대로 Linux 또는 Windows를 사용하십시오. 어셈블러로 FASM을 시도해 볼 것을 제안합니다. 그것은 매우 강력하고 초보자에게 친숙합니다. 수많은 예제 코드와 훌륭한 커뮤니티가 있습니다.

+0

리얼 모드 코드는 재미있을 수 있습니다. :) –

+1

@DanielKamilKozar 예, 이미 전문가 일 때. ;) – johnfound

+0

답장을 보내 주셔서 감사합니다. @johnfound. 나는 당신에게 몇 가지를 묻고 싶습니다 .1) 현대의 부트 로더는 리얼 모드 코드를 사용합니까 ?? 2) 만약 우리가 x86 보드를 가져와서 리얼 모드에서 프로그래밍하는 것이 얼마나 중요합니까? –

1

다른 사람들이 언급 한 것 외에 ... "-f bin"이 아닌 Nasm의 "-f obj"형식으로 어셈블하려고합니다 (오류 메시지의 모양). 형식 문자열은 db이되고 dw이 아닐 수 있습니다. 리눅스 밖에서는 mainprintf에 밑줄이 필요합니다. 밑줄을 사용하지 않고 소스 코드를 작성하고 NACB의 명령 행에 --prefix _을 사용하여 global 또는 extern에 앞에 밑줄을 추가하십시오. OpenWatcom C를 사용하는 경우 밑줄 (!)을 사용하려면 --postfix _을 대신 사용하십시오. (참고 : 두 개의 하이픈이 필요한 몇 가지 Nasm 옵션 중 하나).

"myprog.obj"로 어셈블 한 후에는 C 라이브러리와 링크해야합니다. 세부 사항은 사용중인 컴파일러/링커/라이브러리에 따라 다릅니다.

MBR을 읽으려는 경우 32 비트 Linux 코드를 작성하는 것이 더 쉽습니다. 그러나 다른 질문. 어느 쪽이든, 행운을 비네!

+0

도움을 주신 Frank Kotler에게 감사드립니다. 내가 위에 물어 본 의심의 부부에 대해서도 말씀 드리고 싶습니다. –

+1

어 ... 부트 로더? John Found가 말한 것에 너무 많이 추가 할 수는 없습니다. 나는 "좋은 옛날"에 많은 사람들이 "전문가"가 아니기 때문에 실제 모드 프로그래밍을 배웠다. 배워야 할 것이 많습니다. 세그먼트 레지스터를 순서대로 유지해야하며 (일반적으로 pmode에서는 무시할 수 있음) 64k 세그먼트로 제한됩니다 (64k에서 많은 코드를 얻을 수 있습니다). 부트 로더의 주된 어려움은 OS가 우리를 위해했던 많은 것을 ASSume 할 수 없다는 것입니다. dos ints 나 printf가 없기 때문에 BIOS 인터럽트를 배워야 할 것이다. 우리는 dosbox에서 printf에서 먼 길을 가고있다! –

관련 문제