我在撰寫匯編函式時遇到了一個小問題。
; 我在寫這個時超級失敗。
功能。
.MODEL c, small
.DATA?
.DATA
Curpos_ PROTO C columns_:BYTE, rows_:BYTE
.CODE
公眾號 curpos_
curpos_ PROC C columns_:BYTE, rows_:BYTE
mov dh, columns_
mov dl, rows
mov bh, 0 mov ah, 0
mov ah, 2int 10h
檢索
曲線_ENDP
結束
在我的C檔案中,我將裝配函式的原型化。
#include<stdio.h>/span>
#include<conio.h>/span>
#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值。
clrscr()。
...
_curpos(20,40) 。
getch()。
arcradius()。
}
我遇到的問題是,我的C程式沒有給匯編函式提供正確的引數,在我的C檔案中,我使用_curpos(20,40),但它沒有使用括號中的值。相反,它使用了之前scanf(); 輸入的一些垃圾數字。
我是否有什么錯誤的宣告,原型設計不正確,或者忘記了?
我正在使用 OpenWatcom 和 MASM 6.11.
。謝謝你,Noah "MadDog" Buzelli
編輯。 這里是固定的裝配函式
; 我寫這個的時候超級失敗的
功能。
.MODEL小
.DATA?
.DATA
Curpos PROTO C _columns:BYTE, _rows:BYTE
.CODE
公眾號curpos
曲線 PROC _columns:BYTE, _rows:BYTE
推送bx
mov dh, BYTE PTR _columns
mov dl, BYTE PTR _rows
mov bh, 0
mov ah,2
int 10h
pop bx
ret 4
結束語 ENDP
結束
這里是我的C語言原型
extern void __stdcall curpos(char columns, char rows)。
謝謝你Mgetz :)
uj5u.com熱心網友回復:
所以你需要為裝配方法指定呼叫慣例。默認情況下,open watcom使用__stdcall
所以它應該是這樣的:
extern void __stdcall curpos(char _columns, char _rows)。
這個asm可能是正確的,但沒有經過測驗。 我們正在手動做所有的事情,而不是依靠MASM的魔法來設定BP和計算堆疊中args的位置。
_columns$ = 4 ; size = 1
_rows$ = 6 ; 相對于框架指標的偏移量
; saved-BP在[bp 0],ret addr在[bp 2],第一個引數在[bp 4]
_curpos@4 PROC ; COMDAT
推動bp
mov bp, sp ; for access to args on the stack, [sp] isn'/span>t valid
push bx ; 保存/恢復呼叫者's BX
mov dh, BYTE PTR _columns$[bp].
mov dl, BYTE PTR _rows$[bp].
mov bh, 0; page=0
mov ah, 2; page=0; page=0
int 10h ; int 10h / AH=2 - BIOS 設定游標位置
pop bx
pop bp ; 不需要mov sp,bp,SP已經是好的了。
ret 4 ; pop ret addr,然后SP =4。
_curpos@4 ENDP
值得一提的是,使用行內匯編可能比在asm中做完整的實作更好。 如果你使用行內asm,編譯器會處理所有這些,你只需要把輸入輸入到暫存器中,而不是寫代碼回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/320382.html
標籤:
