1. 程式人生 > >用匯編實現C庫函式的呼叫

用匯編實現C庫函式的呼叫

title ccall

.
386
.model flat,c

.data?
arg_num dword
0
arg_tab dword
100 dup(0)
arg_tye dword
100 dup(0)
fun_ptr dword
0


.code

push_arg_ini proc
mov arg_num, 0ret
push_arg_ini endp


push_arg proc, arg : sdword, tye : sdword
mov eax, arg_num
mov ebx, offset arg_tab
mov ecx, arg
mov [ebx+eax*4], ecx

mov ebx, offset arg_tye
mov ecx, tye
mov [ebx+eax*4], ecx

add eax, 1mov arg_num, eax
ret
push_arg endp


push_fun proc, fun : sdword
mov eax,fun
mov fun_ptr, eax
ret
push_fun endp


i_fun_call proc
local count : dword
xor eax, eax
mov ebx, offset arg_tab
mov ecx, offset arg_tye
mov count, 0

.while eax < arg_num
mov edx, [ecx+eax*4]
;浮點型入棧;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.if edx
fld dword ptr [ebx+eax*4]
sub esp,8fstp qword ptr [esp]
.elseif
push [ebx+eax*4]
.endif
add eax, 1add count, 4
.endw

mov eax, fun_ptr
call eax
add esp, count
ret
i_fun_call endp

f_fun_call proc
local count : dword
xor eax, eax
mov ebx, offset arg_tab
mov ecx, offset arg_tye
mov count, 0

.while eax < arg_num
mov edx, [ecx+eax*4]
;浮點型入棧;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .if edx
fld dword ptr [ebx+eax*4]
sub esp,8fstp qword ptr [esp]
.elseif
push [ebx+eax*4]
.endif
add eax, 1add count, 4
.endw

mov eax, fun_ptr
call eax
add esp, count
ret
f_fun_call endp


end

相關推薦

用匯實現C函式呼叫

title ccall .386.model flat,c.data?arg_num dword 0arg_tab dword 100 dup(0)arg_tye dword 100 dup(0)fun_ptr dword 0.codepush_arg_ini procmov arg_num, 0retpus

實現: C常見函數,串操作指令作用

默認 rep ptr 多重 ++ 例如 需要 函數 toc 目錄 匯編實現: C庫常見函數 一丶匯編實現Strncpy拷貝函數 匯編實現: C庫常見函數 一丶匯編實現Strncpy拷貝函數 void __asmStrncpy(char *des,char *src,i

程式設計實現C函式

1.memcpy函式 memcpy 函式用於 把資源記憶體(src所指向的記憶體區域) 拷貝到目標記憶體(dest所指向的記憶體區域);拷貝多少個?有一個size變數控制拷貝的位元組數; 函式原型:void *memcpy(void *dest, void *src, unsigned int count

C/C++函式strstr和find實現子字串查詢

1 子字串查詢實現Demo #include<iostream> #include<string> #include<cstring> using namesp

標準C函式

標準c庫函式標頭檔案列表 <assert.h> 診斷 <ctype.h> 字元檢測 <errno.h> 錯誤檢測

DEP引起的DLL函式呼叫失敗

1          什麼是DEP(資料執行保護) 根據微軟官方定義:資料執行保護 (DEP) 是一種有助於防止您的計算機免受病毒和其他安全威脅破壞的安全功能。有害的程式可能會通過試圖執行(也稱為“執行”)

c語言函式呼叫模型

對於記憶體四區不懂得戳這裡 記憶體講解 這篇文章需要知道記憶體四區的知識 首先分級呼叫函式 使需要的資料入棧 然後逐級出棧,返回數值,將棧區的記憶體進行釋放    在main函式執行完之前 fa fb 都可以呼叫ma

C函式-memcpy()

/**memcpy指的是c和c++使用的記憶體拷貝函式, memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝n個位元組到目標dest所指的記憶體地址的起始位置中。*/ 引數 dest – 指向用於儲存複製內容的目標數。 src-- 指向要複製的資料來源。 n – 要被複制的

從彙編角度檢視C語言函式呼叫約定【非常有用】

轉自:https://blog.csdn.net/Holmofy/article/details/76094986   為了防止出現不必要的程式碼影響組合語言的檢視,所以程式中不使用任何庫函式,以保持彙編程式碼的簡潔。 這裡所使用的彙編是VC的MASM。 預設函式呼叫方式_

C語言函式呼叫過程的彙編分析

轉自:   http://www.cnblogs.com/xiaojianliu/articles/8733560.html   下面一段C程式: int bar(int c, int d) { int e = c + d; return e; }

C++中帶有預設引數的宣告和定義。Qt中重寫預設建構函式C++中函式呼叫時實參個數和函式定義時的形參個數不一致時的處理。

1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”

c語言函式呼叫過程中棧的工作原理理解

差不多每個程式設計師都知道,函式呼叫過程,就是層層入棧出棧的過程。 那麼這個過程中的詳細的細節是什麼樣子的呢? 閱讀了以下幾篇文章之後,對整個過程基本理解了: C函式呼叫過程原理及函式棧幀分析 閱讀經典——《深入理解計算機系統》04 函式返回值與棧 針對自己的理解,做個記錄:

關於C語言函式呼叫的學習【待解決】

在學習關於函式呼叫時,仿照最大函式的呼叫,編寫了一個求最小值的程式,程式碼如下: 1 #include<stdio.h> 2 3 int min(int x,int y); 4 int main() 5 { 6 int a=10,b=20; 7 int c;

簡單的api實現以及動態函式呼叫

實現一個簡單的api功能,環境python2.7 請求方法:curl http://ip:8000/?name={api中的方法名}|python -m json.tool 只需編寫api的方法即可 #!/usr/bin/env python #coding:utf-8 import

JIT指令碼引擎:使用匯實現__try和__catch

    使用上一篇文章的資料,就可以使用匯編實現異常處理了。下面來看一個例子。    這是一個彙編實現的函式,計算一個數字廚藝另一個數字得到的結果和餘數。如果發生了除零錯的話,使用異常處理將結果和餘數都設定為0。  1 CONSTANT 2 VARIABLE 3 CODE 4  5 //stru

託管C++中函式呼叫的雙重轉換(Double Thunking)

 在VC.Net中使用預設設定/clr編譯時,一個託管函式會產生兩個入口點,一個是託管的,供託管程式碼呼叫,另外一個是非託管的,供非託管程式碼呼叫。但是函式地址,特別是虛擬函式指標只能有一個值,所以需要有一個預設的入口。非託管入口點可能是所有呼叫的預設入口(在 Visual

C#建構函式呼叫其他建構函式(轉)

其實就是使用this來實現的。看一下例子就會明白的了。 class Class1 { public Class1() { //Code 1 } public Class1(string s) : this() { //Code 2 } publ

C語言函式呼叫的底層機制

這是一篇介紹C語言中的函式呼叫是如何用實現的文章。寫給那些對C語言各種行為的底層實現感興趣人的入門級文章。如果你是C語言或者彙編、底層技術 的老鳥或是對這個問題不感興趣,那麼這篇文章只會耽誤您的時間,您大可不必閱讀他。當然如果前輩們願意為我指出不足,我將十分感謝您的指導,並

vc++ 如何自己寫c函式lib

步驟1、      開啟VC++ 6.0,新建一個空Win32 Static Library(靜態函式)       新建一個11.cpp原始檔和22.h標頭檔案    執行,這時候在這個專案下就會生成0654.lib 和22.h檔案 把0654.lib檔案複製到

C函式重定向(在玩兒STM32的時候看到有這麼個用法)

usart這部分程式碼我也是從網上copy出來的,一下是作者的解釋: 簡單地說:想在mdk 中用printf,需要同時重定義fputc函式和避免使用semihosting(半主機模式),  標準庫函式的預設輸出裝置是顯示器,要實現在串列埠或LCD輸出,必須重定義標準