簡體   English   中英

編譯程序以在DOS模式下運行

[英]compiling a program to run in DOS mode

我寫了一個簡單的程序,在DOS模式下運行。 一切都在Win XP / Vista / Seven中的模擬控制台下運行,但不在DOS中。 錯誤說: this program caonnot be run in DOS mode 我想知道編譯器標志或更大的問題。

對於編程,我使用Code :: Blocks v 8.02進行編譯設置:

-Wall -W -pedantic -pedantic-errors

在Project \\ Build options \\ Compiler settings中

我嘗試了一個干凈的DOS模式,從CD啟動,並在虛擬機中設置DOS。 出現相同的錯誤。

我應該打開更多的編譯器標志嗎? 一些特定的386/486優化?

UPDATE

好的,我已經下載,安裝和配置了DJGPP。 甚至解決了libs和包含的一些問題。 還有兩個問題。

1)我無法編譯調用_strdate_strtime的代碼,我已經仔細檢查了包含,因為MSDN說它需要time.h ,但仍然錯誤說: _strdate was not declared in this scope ,我甚至試圖添加std :: _ strdate,但是我有4個,而不是2個錯誤

2)第二個代碼是關於gotoxy ,它看起來像:

#include <windows.h>

void gotoxy(int x, int y)
{
  COORD position;
  position.X = x; position.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}

錯誤說沒有windows.h,所以我把它放到位,但是有更多的錯誤說windows.h中缺少一些錯誤, 我支持它不起作用因為這個函數嚴格用於windows嗎? 有沒有辦法為DOS編寫類似的gotoxy

UPDATE2

1)解決使用time(); 而不是_strdate(); _strtime(); 這是代碼

time_t rawtime;
struct tm * timeinfo;
char buffer [20];

time ( &rawtime );
timeinfo = localtime ( &rawtime );

strftime (buffer,80,"%Y.%m.%d %H:%M:%S\0",timeinfo);
string myTime(buffer);

它現在在DJGPP下編譯。

UPDATE3

仍需要使用 gotoxy解決代碼 - 將其替換為其他編譯的代碼(在DJGPP下)。

感謝大家的幫助。 剛學到一些關於編譯的新東西(標志,舊的IDE,如DJGPP,OpenWatcom)和刷新的內存設置DOS工作: - )

從事物的聲音來看,您目前正在編譯Windows控制台程序。 即使它是一個控制台程序,它仍然需要Windows運行。

要編譯一個程序以在真正的DOS上運行,你需要找到一個(可能真的很舊的)編譯器和(特別是)目標DOS的鏈接器並且可以生成DOS MZ可執行文件。 最后一個針對MS-DOS的Microsoft編譯器是VC ++ 1.52c。 如果內存服務,Borland繼續在稍后的目標DOS上,通過像Broland C ++ 5這樣的東西。

我相信如果您查看Digital Mars網站,他可能仍然有一個針對DOS的C ++編譯器。 否則,你將被困在尋找使用過的東西並且很老了。

編輯:看其他答案讓我想起了DJGPP和OpenWatcom。 我很抱歉以前沒有提過它們。

請注意,從C ++的角度來看,Borland和Microsoft實際上都是舊的編譯器 - 它們根本不做命名空間,模板支持從微軟編譯器中不存在到Borland中的平庸。 DJGPP基本上是一個DOS擴展器,gcc已被移植到其中; 它過時(或現代)的程度將取決於涉及哪個版本的gcc。 如果我沒有弄錯的話,Digital Mars編譯器比Borland編譯器更現代,但是Walter Bright現在大部分時間都花在D而不是C ++上,所以C ++編譯器並沒有真正與gcc或MSVC競爭,更不用說基於EDG前端的Comeau或Intel。

您所稱的“模擬控制台”與仿真或DOS無關。 您可能仍在使用控制台子系統生成32/64位Windows可執行文件。

首先將編譯器更改為能夠生成16位代碼的編譯器。 我很確定OpenWatcom仍然支持開箱用的 16位MZ目標。 IIRC DJGPP ,但我不確定,也不知道它是否仍然保持。

編輯:關於gotoxy ,您可以:

  1. 使用PDCurses而不關心內部使用的是什么(我認為它是INT10)
  2. 自己使用中斷0x10
  3. 直接寫入0xB8000的VGA存儲器

我從來沒有真正為DOS開發,所以我不知道哪種方法會被認為是最好的。 然而,第三個似乎是最快的一個。

在這里一覽: MinGW編譯為MS DOS

基本上,使用DJCPP作為Code :: Blocks的后端。

使用conio.h庫中的gotoxy (dos友好;))

#include <conio.h>
#include <stdio.h>

void main()
{
    gotoxy(5,5);
    printf("Printing at (5,5)");
}

簡單

另請查看Borland的文檔

我習慣使用DJGPP在普通的ms-dos .. 主頁下編譯東西。

它是一個完全免費的編譯器套件,應該仍然可以無縫工作!

您可以使用DJGPP附帶的conio.h頭文件中的gotoxy

您想告訴編譯器目標dos。 我不知道該怎么做,對不起,但也許這可以作為谷歌搜索的暗示......

查看Code :: Blocks網站,您的IDE似乎可以支持各種編譯器(GCC,MSVC ++等)。 首先,找出您正在使用的編譯器。 然后檢查編譯器文檔。

一旦你知道你正在使用什么編譯器,那么你可以改寫(改進)你的問題 - 我相信stackoverflow上的人會知道。

根據這個帖子 ,似乎Open Watcom] 2編譯器的目標是dos。 此外,它受IDE(Code :: Blocks)支持。

祝好運!

win32 exe中有一個dos stub標頭,在純dos上運行時顯示此消息。 您應該使用dos編譯器(例如turbo c)編譯它,或者如果DOS是代碼塊中的DOS,則提供目標平台。 它的軟件問題不是硬件平台。

在Linux或Windows上托管的ia16-elf具有GCC 6.2以鏈接.COM文件。 (它使用Winery和MinGW在Mac上托管bash shell並解壓縮windows存檔)。

使用DosBox(或Mac上的Boxer),QEMU,VirtualBox進行測試,而不是重新啟動您關心的真實物理機。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM