Код ассемблера (написанный для masm) в программе на C (скомпилированный с gcc) ... как? - PullRequest
2 голосов
/ 05 декабря 2011

У меня есть ассемблерный код, и я хочу внедрить его в C-программу.Я использовал masm, чтобы заставить мой ассемблерный код работать, и я использую gcc для компиляции C-кода.

Я использую NetBeans в Windows XP.

Я хочу, чтобы командная строка перешла в полноэкранный режим, а затем нарисовала линию следующим образом:

.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 ]

4 голосов
/ 05 декабря 2011

Нельзя смешивать прерывания DOS с Windows API. Вам, вероятно, нужно вместо этого использовать полноэкранный режим DirectX .

2 голосов
/ 05 декабря 2011

Как правило, смешивание ассемблера с C может быть выполнено с помощью GCC путем определения функций, записанных в asm в отдельном файле ассемблера, который, если он скомпилирован в .o, а затем связан вместе с программой 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. Однако похоже, что это было исправлено в v. 2.10 (http://en.wikipedia.org/wiki/GNU_Assembler)

Кроме того, ответ @ Нейла стоит, вы не можете делать прерывания DOS из программы Windows.

...