在C程序中汇编代码(为masm编写)(用gcc编译)......怎么样?

时间:2011-12-04 20:27:42

标签: c gcc netbeans assembly masm

我有汇编代码,我想将它实现为C程序。我一直在使用masm来使我的汇编代码工作,而我正在使用gcc来编译C代码。

我在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程序中运行...提前感谢!

2 个答案:

答案 0 :(得分:4)

您不能将DOS中断与Windows API混合使用。您可能需要使用DirectX的full screen mode代替。

答案 1 :(得分:2)

通常将汇编程序与C混合可以通过在单独的汇编程序文件中定义asm编写的函数来完成,如果编译为.o然后与C程序链接在一起,C程序调用汇编程序编译的对象中的函数。

为此您需要了解调用约定,如何在堆栈或寄存器中传递参数以及编写定义函数原型的头文件,这是在汇编程序中实现的。

如何将asm与C混合的一些例子:

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

其他方式是使用GCC内联汇编语法:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

请注意,最初的GNU Assembler语法与masm和许多其他x86汇编程序完全不同。但是看起来这已经在2.10版(http://en.wikipedia.org/wiki/GNU_Assembler)中修复了

另外@ Neil的回答代表,你不能从Windows程序做DOS中断。