2013-11-25 72 views
2

我試圖轉移我的一些16位的實模式OS項目採用Turbo C編譯器的工作3.1問題有標籤的Turbo C和內嵌x86彙編

嘗試中使用標籤時,我有以下問題我的內聯彙編:

void mos_io_print_string_c(char* str, char color) { 
asm { 
    MOV  SI, [str]  // point SI to str 
    MOV  BL, [color]  // point BL to color 
    MOV  AH, 03h   // get current location of cursor 
    INT  10h    // call BIOS 
_do:  
    LODSB     // load the next char from our string 
    CMP  AL, 0   // at the end of our string? 
    JE  _done   // if so, leave 
    MOV  AH, 02h   // set cursor pos: whatever is set 
    INT  10h    // call BIOS 
    INC  DL    // increase cursor horiz pos 
    MOV  AH, 09h   // output char with attributes 
    MOV  BH, 0   // set page to write to 
    MOV  CX, 1   // number of times to print character 
    INT  10h    // call BIOS 
    JMP  _do    // loop 
_done: 
    MOV  AH, 0Eh   // setup AH for BIOS output char 
    MOV  AL, 0Dh   // carriage return 
    INT  10h    // output carriage return 
    MOV  AL, 0Ah   // new line 
    INT  10h    // output new line 
}} 

我正在從Turbo C的以下輸出與3.1:

Compiling PS.C: 
.Error PS.C 39: Undefined label '_do' 
Error PS.C 39: Undefined label '_done' 

我曾嘗試一切,包括增加@@符號標籤。我甚至試圖用CS:_doCS:_done來引用它們。我也嘗試在標籤上使用NEAR運算符。我知道Turbo C是舊的,但我在選擇16位C編譯器時受到限制。如果任何人有任何建議,將是偉大的。

謝謝!

回答

2

它已經幾年,但我相信你需要,打破了內聯彙編塊和定義普通的C標籤,該分支指令就可以跳轉到(沒有任何名稱飾)

編輯:谷歌止跌回升具有詳細信息的舊用戶指南 - http://www.ic.unicamp.br/~celio/mc404/turboc201/embedded-asm.html

+0

你的意思是什麼,通過定期的「C標籤」? – JohnnyStarr

+0

你跳轉到goto的那種。語法是相同的,但是你需要用中間的標籤來分隔他們周圍的asm {}塊。例如。 void foo(){my_loop:asm {jmp my_loop}} – doynax

0

如所暗示的,內聯塊內的標籤實際上必須位於內嵌塊之外。那就是:

asm 
{ 
    instruction 
    instruction 
} 
label: 
asm 
{ 
    instruction 
    instruction 
    jnz label 
}