2011-12-04 98 views
2

我有彙編代碼,我想實現它成C程序。我一直在使用masm來使我的彙編代碼正常工作,並且我正在使用gcc來編譯C代碼。C程序中的彙編代碼(用masm編寫)(用gcc編譯)......怎麼樣?

我在Windows XP中使用NetBeans。

我想在命令提示符下進入全屏模式,然後畫一條線,像這樣做:

.model small 
.stack 

.code 
    main proc far 
    mov ax,@data 
    mov DS,ax 
    mov ah,00h 
    mov al,12h 
    int 10h 
    mov ah,02h 
    mov dh,14 
    mov dl,37 
    int 10h 

    mov di,65 
    mov ah,0ch 
    mov bh,00h 
    mov al,09h 
    mov Cx,290 
    mov dx,200 

arriba: int 10h 
    inc cx  
    dec di  
    Jnz arriba 
    mov di,65 
    mov ah,08h 
    int 21h 
    mov ax,4c00h 
    int 21h 

    main endp 
    end main 

該代碼工作,如果我使用MASM,但我不知道如何得到它裏面我的工作C程序...提前致謝!

+0

[如何使用內聯彙編在C/C++程序中調用DOS中斷?](http://stackoverflow.com/questions/2716362/how-to-call-dos-interrupts-within-acc-程序使用內聯彙編) – Neil

+0

Oo!?所以我需要使用turbo c或類似的東西通過彙編程序搞亂控制檯? omg ...但是那麼我所有的C代碼都會中斷,對吧?例如,我將無法使用MessageBox,對吧? – Kirby

回答

2

通常情況下,使用GCC混合彙編程序可以使用GCC完成,方法是在單獨的彙編程序文件中定義用asm編寫的函數,如果編譯爲.o,然後與C程序連接在一起,C程序調用匯編程序編譯的對象中的函數。

爲此,您需要了解調用約定,參數如何在堆棧或寄存器中傳遞,並寫入定義函數原型的頭文件,該函數原型在彙編程序中實現。

一些例子來說明如何使用C混合ASM:

http://www.cs.lmu.edu/~ray/notes/nasmexamples/

其他的方法是使用GCC內聯彙編語法:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

注意,原來GNU彙編語法比MASM完全不同,許多其他x86彙編程序。然而看起來這已經在2.10版本中得到修復(http://en.wikipedia.org/wiki/GNU_Assembler)

另外@ Neil的回答站,你不能從Windows程序做DOS中斷。

+0

那麼,我可以創建一個彙編代碼,它可以打開它自己的命令提示符,在那裏我可以控制任何DOS(就像我會用匯編一樣完成它),然後從主程序調用它? – Kirby

+0

如果上面的彙編程序代碼在Windows XP命令提示符下工作,那麼可能會在那裏模擬DOS中斷。 是的,你可以用C語言編寫主程序,並從那裏調用你的彙編代碼作爲函數。在回答中,我試圖指出如何組合C和彙編代碼。 –

4

您不能將DOS中斷與Windows API混合使用。您可能需要使用DirectX的full screen mode

+0

但是,如果我錯了,請糾正我,我不能使用匯編代碼來做到這一點,對吧? – Kirby

+0

@Kirby:可以在asm中執行,但是在Windows中可能不像DOS那樣直截了當(看起來DirectX功能可以通過COM接口訪問)。 –

+0

對於最終的項目來說,這看起來不必要的複雜,所以我要告訴我的老師xD非常感謝你! – Kirby