在 C 程序中使用汇编函数
Using an assembly function in a C program
我的汇编函数有一个小问题。
; Im failing super hard at writing this
; Function.
.MODEL c, small
.DATA?
.DATA
curpos_ PROTO C columns_:BYTE, rows_:BYTE
.CODE
public curpos_
curpos_ PROC C columns_:BYTE, rows_:BYTE
mov dh, columns_
mov dl, rows_
mov bh, 0
mov ah, 2
int 10h
ret
curpos_ ENDP
END
还有我的 C 文件,我在其中制作了汇编函数的原型。
#include<stdio.h>
#include<conio.h>
#include<math.h>
void clrscr(void);
extern char _columns, _rows;
extern void _curpos(char _columns, char _rows);
void arcradius() {
float w;
float h;
float radi = w / 2.0;
float value;
clrscr();
...
_curpos(20,40);
getch();
arcradius();
}
我遇到的问题是我的 C 程序没有为汇编函数提供正确的参数,在我的 C 文件中我使用 _curpos(20,40) 但它没有使用括号中的值。相反,它使用了先前 scanf() 中的一些垃圾编号;输入。
我是否有什么地方声明错误、原型设计不正确或忘记了?
我正在使用 OpenWatcom 和 MASM 6.11。
谢谢,Noah“MadDog”Buzelli
编辑:
这里是固定的汇编函数
; Im failing super hard at writing this
; Function.
.MODEL small
.DATA?
.DATA
curpos PROTO C _columns:BYTE, _rows:BYTE
.CODE
public curpos
curpos PROC C _columns:BYTE, _rows:BYTE
push bx
mov dh, BYTE PTR _columns
mov dl, BYTE PTR _rows
mov bh, 0
mov ah, 2
int 10h
pop bx
ret 4
curpos ENDP
END
这是我的 C 原型
extern void __stdcall curpos(char columns, char rows);
谢谢 Mgetz :)
所以你需要指定Calling convention为组装方法。默认情况下打开 watcom 使用 __stdcall
所以它应该看起来像这样:
extern void __stdcall curpos(char _columns, char _rows);
这个 asm 可能是正确的,但未经测试。我们是手动完成所有操作,而不是依靠 MASM 的魔力来设置 BP 和计算 args 在堆栈中的位置。
_columns$ = 4 ; size = 1
_rows$ = 6 ; offsets relative to the frame pointer
; saved-BP at [bp+0], ret addr at [bp+2], first arg at [bp+4]
_curpos@4 PROC ; COMDAT
push bp
mov bp, sp ; for access to args on the stack, [sp] isn't valid
push bx ; save/restore the caller's BX
mov dh, BYTE PTR _columns$[bp]
mov dl, BYTE PTR _rows$[bp]
mov bh, 0 ; page=0
mov ah, 2
int 10h ; int 10h / AH=2 - BIOS Set cursor position
pop bx
pop bp ; no mov sp,bp needed, SP is already good
ret 4 ; pop ret addr, then SP+=4
_curpos@4 ENDP
就其价值而言,最好为此使用内联汇编而不是在 asm 中进行完整实现。如果你使用内联 asm,编译器会处理所有这些,你只需要将输入放入寄存器,而不是编写 returns.
的代码
我的汇编函数有一个小问题。
; Im failing super hard at writing this
; Function.
.MODEL c, small
.DATA?
.DATA
curpos_ PROTO C columns_:BYTE, rows_:BYTE
.CODE
public curpos_
curpos_ PROC C columns_:BYTE, rows_:BYTE
mov dh, columns_
mov dl, rows_
mov bh, 0
mov ah, 2
int 10h
ret
curpos_ ENDP
END
还有我的 C 文件,我在其中制作了汇编函数的原型。
#include<stdio.h>
#include<conio.h>
#include<math.h>
void clrscr(void);
extern char _columns, _rows;
extern void _curpos(char _columns, char _rows);
void arcradius() {
float w;
float h;
float radi = w / 2.0;
float value;
clrscr();
...
_curpos(20,40);
getch();
arcradius();
}
我遇到的问题是我的 C 程序没有为汇编函数提供正确的参数,在我的 C 文件中我使用 _curpos(20,40) 但它没有使用括号中的值。相反,它使用了先前 scanf() 中的一些垃圾编号;输入。
我是否有什么地方声明错误、原型设计不正确或忘记了?
我正在使用 OpenWatcom 和 MASM 6.11。
谢谢,Noah“MadDog”Buzelli
编辑: 这里是固定的汇编函数
; Im failing super hard at writing this
; Function.
.MODEL small
.DATA?
.DATA
curpos PROTO C _columns:BYTE, _rows:BYTE
.CODE
public curpos
curpos PROC C _columns:BYTE, _rows:BYTE
push bx
mov dh, BYTE PTR _columns
mov dl, BYTE PTR _rows
mov bh, 0
mov ah, 2
int 10h
pop bx
ret 4
curpos ENDP
END
这是我的 C 原型
extern void __stdcall curpos(char columns, char rows);
谢谢 Mgetz :)
所以你需要指定Calling convention为组装方法。默认情况下打开 watcom 使用 __stdcall
所以它应该看起来像这样:
extern void __stdcall curpos(char _columns, char _rows);
这个 asm 可能是正确的,但未经测试。我们是手动完成所有操作,而不是依靠 MASM 的魔力来设置 BP 和计算 args 在堆栈中的位置。
_columns$ = 4 ; size = 1
_rows$ = 6 ; offsets relative to the frame pointer
; saved-BP at [bp+0], ret addr at [bp+2], first arg at [bp+4]
_curpos@4 PROC ; COMDAT
push bp
mov bp, sp ; for access to args on the stack, [sp] isn't valid
push bx ; save/restore the caller's BX
mov dh, BYTE PTR _columns$[bp]
mov dl, BYTE PTR _rows$[bp]
mov bh, 0 ; page=0
mov ah, 2
int 10h ; int 10h / AH=2 - BIOS Set cursor position
pop bx
pop bp ; no mov sp,bp needed, SP is already good
ret 4 ; pop ret addr, then SP+=4
_curpos@4 ENDP
就其价值而言,最好为此使用内联汇编而不是在 asm 中进行完整实现。如果你使用内联 asm,编译器会处理所有这些,你只需要将输入放入寄存器,而不是编写 returns.
的代码