2011-12-04 62 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