色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在C中使用匯編程序的原因是?

jf_78858299 ? 來源:匯編語言 ? 作者:匯編語言 ? 2023-04-04 15:00 ? 次閱讀

現今,完全用匯編書寫的程序是非常少的。編譯器能很好地將高級語言轉換成有效的機器代碼。因為用高級語言書寫代碼非常容易,所以高級語言變得很流行。此外,高級語言比匯編語言更容易移植!

當使用匯編語言時,我們經常將它使用在代碼中的一小部分上。有兩種使用匯編語言的方法:在C中調用匯編子程序或內嵌匯編。內嵌匯編允許程序員把匯編語句直接放入到C代碼中。這樣是非常方便的;但是,內嵌匯編同樣存在缺點。匯編語言的書寫格式必須是編譯器使用的格式。目前沒有一個編譯器支持NASM格式。不同的編譯器要求使用不同的格式。Borland和Microsoft要求使用MASM格式。DJGPP和Linux中gcc要求使用GAS格式。在PC機上,調用匯編子程序是更標準的技術。

在C中使用匯編程序通常是因為以下幾個原因:

1、需要直接訪問計算機的硬件特性,而用C語言很難或不可能做到。

2、程序執行必須盡可能地快,而且相比于編譯器,程序員手動優化的代碼更好。

最后一個原因不像它以前一樣有根據。因為這些年編譯器技術提高了,而且編譯器通常可以產生非常有效的代碼(特別是當開啟編譯器優化的時候)。調用匯編程序的缺點:可移植性和可讀性減弱了。

絕大部分的C調用約定已經確定了。但是,還需要描述一些額外的特征。

保存寄存器

首先, C假定子程序保存了下面這幾個寄存器的值:EBX,ESI,EDI, EBP,CS,DS,SS,ES。這并不意味著不能在子程序內部修改它們。相反,它表示如果子程序改變了它們的值,那么在子程序返回之前必須恢復它們的原始值。EBX,ESI和EDI的值不能被改變,因為C將這些寄存器用于寄存器變量。通常都是使用堆棧來保存這些寄存器的原始值。

函數名

大多數C編譯器都在函數名和全局或靜態變量前附加一個下劃線字符。例如,函數名f將指定為_f。因此,如果這是一個匯編程序,那么它必須標記為_f,而不是f。Linux gcc編譯器并不附加任何字符。在可執行的Linux ELF下,對于C函數f,你只需要簡單使用函數名f即可。但是,DJGPP的gcc卻附加了一個下劃線。注意,在匯編程序skeleton中(圖1.7),主程序函數名是_asm main。

傳遞參數

按照C調用約定,一個函數的參數將以一定順序壓入棧中,這個順序與它們出現在函數調用里的順序相反。考慮這條C語句:printf("x = %d\\n",x); 圖4.11展示了如何編譯這條語句(用等價的NASM格式)。圖4.12展示了執行完printf函數的開始部分后,堆棧的狀態。printf函數一個可以攜帶任意個參數的C語言庫函數。C調用約定的規則就是專門為允許這些類型的函數而規定的。因為format字符串的地址最后壓入堆棧,所以不管有多少參數傳遞到函數,

圖片

計算局部變量的地址

找到定義在data或bss段的變量的地址是非常容易的。基本上,連接程序做的就是這件事情。但是,要計算出在堆棧上的一個局部變量(或參數)的地址就不簡單了。可是,當調用子程序的時候,這種需求是非常普通的。考慮傳遞一個變量(讓我們稱它為x)的地址到一個函數(讓我們稱它為foo)的情況。如果x處在堆棧的EBP ? 8的位置,你不可以這樣使用:

mov       eax, ebp - 8

為什么?因為指令MOV儲存到EAX里的值必須能由匯編器計算出來(也就是說,它最后必須是一個常量)。但是,有一條指令能做這種需求的計算。它就是LEA (即Load Effective Address,載入有效地址)。下面的代碼就能計算出x的地址并將它儲存到EAX中:

lea         eax, [ebp - 8]

現在EAX中存有了x的地址,而且當調用函數foo的時候,就可以將其壓入到棧中。不要搞混了,這條指令看起來是從[EBP-8]中讀數據;然而,這并不正確。LEA指令永遠不會從內存中讀數據。它僅僅計算出一個將會被其它指令使用到的地址,然后將這個地址儲存到它的第一個操作數里。因為它并沒有實際讀內存,所以不指定內存大小(例如:dword)是必須的或說是允許的。

返回值

返回值不為空的C函數執行完后會返回一個值。C調用約定規定了這個要如何去做。返回值需通過寄存器傳遞。所有的整形類型(char,int,enum,等)通過EAX寄存器返回。如果它們小于32位,那么儲存到EAX的時候,它們將被擴展成32位。(它們如何擴展取決于是有符號類型還是無符號類型。) 64位的值通過EDX:EAX寄存器對返回。浮點數儲存在數學協處理器中的ST0寄存器中。(這個寄存器將在浮點數這一章來討論。)

其它調用約定

所有的80x86 C編譯器中都支持上面描述的標準C調用約定的規則。通常編譯器也支持其它調用約定。當與匯編語言進行接口時,知道編譯器調用你的函數時使用的是什么調用約定是非常重要的。通常,缺省時,使用的是標準的調用約定;但是,并不總是這一種情況4。使用多種約定的編譯器通常都擁有可以用來改變缺省約定的命令行開關。它們同樣提供擴展的C語法來為單個函數指定調用約定。但是,各個編譯器的這些擴展標準可以是不一樣的。

GCC編譯器允許不同的調用約定。一個函數的調用約定可以通過擴展語法attribute 明確指定。例如,要聲明一個返回值為空的函數f,它帶有一個int參數,使用標準調用約定,需使用下面的語法來聲明它的原型:

void   f ( int ) _attribute_(( cdecl ));

GCC同樣支持標準call 調用約定。通過把cdecl替換成stdcall,上面的函數可以指定為使用這種約定。stdcall約定和cdecl約定的不同點是stdcall要求子程序將參數移除出棧(和Pascal調用約定一樣)。因此,stdcall調用約定只能使用在帶有固定參數的函數上(也就是說,不可以是函數printf和scanf)。

GCC同樣支持稱為regparm 的約定,這種約定告訴編譯器前3個整形參數通過寄存器傳遞給函數,而不是通過堆棧。這是許多編譯器支持的一個共同的優化模式。

Borland和Microsoft使用一樣語法來聲明調用約定。它們在C代碼中加上關鍵字_cdecl和_stdcall。這些關鍵字用來修飾函數。在原型聲明中,它們出現在函數名的前面例如,上面的函數f用Borland和Microsoft定義如下:

void _cdecl f ( int );

每種調用約定都有各自的優缺點。cdecl調用約定的主要優點是它非常簡單而且非常靈活。它可以用于任何類型的C函數和C編譯器。使用其它約定會限制子程序的可移植性。它的主要缺點是與其它約定相比它執行較慢而且使用更多的內存(因為函數的每次調用都需要用代碼將參數移除出

棧。)。

stdcall調用約定的主要優點是相比于cdecl它使用較少的內存。在CALL指令之后,不需要清理堆棧。它的主要缺點是它不能使用于可變參數的函數。

使用寄存器傳遞參數的調用約定的優點是速度非常快。主要缺點是這種約定太復雜。有些參數可能在寄存器中,而另一些可能在堆棧中。

在匯編程序中調用C函數

C與匯編接口的一個主要優點是允許匯編代碼訪問大型C庫和用戶寫的函數。例如,如果你想調用一下scanf函數來從鍵盤讀一個整形,該怎么辦?圖4.14展示了完成這件事的代碼。需要記住的非常重要的一點就是scanf函數遵循字面意義的C調用標準。這就意味著它保存了EBX,ESI和EDI寄存器的值;但是,EAX,ECX和EDX寄存器的值可能會被修改。事實上,EAX肯定會被修改,因為它將保存scanf調用的返回值。至于與C接口的其它例子,可以看用來產生asm io.obj的asm io.asm文件中的代碼。

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PC機
    +關注

    關注

    2

    文章

    201

    瀏覽量

    28573
  • 匯編語言
    +關注

    關注

    14

    文章

    409

    瀏覽量

    35793
  • 編譯器
    +關注

    關注

    1

    文章

    1623

    瀏覽量

    49108
  • nasm
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6867
收藏 人收藏

    評論

    相關推薦

    求幫忙寫個匯編程序

    求大神幫忙寫一個匯編程序用匯編程序實現“行走的小人”這一程序的源代碼???
    發表于 09-26 22:49

    匯編程序中的常量怎么定義?

    ,并在程序初始化時加載到數組中。匯編程序文件使用數組的全局名稱來確定系數的開頭,并相應地加載系數值。這一點讓我吃驚,因為系數只由匯編程序使用。有沒有一種簡單的方法可以
    發表于 10-16 10:14

    Keil下完成一個匯編程序的編寫

    文章目錄要求一、Keil下完成一個匯編程序的編寫1、新建工程2、配置環境3、編譯測試(1)測試代碼(2)仿真器設置(3)編譯調試4、hex文件分析要求Keil下完成一個匯編程序的編
    發表于 08-11 08:04

    Keil下完成一個匯編程序的編寫

    Keil下完成一個匯編程序的編寫,學習動態調試變量;并注意觀察最終生成hex文件的各段的大小,以及Hex文件前8個字節內容,解釋其含義。(3)在上面Keil 匯編基礎上用匯編程序完成1~100 求和 (1+2+3+…+100)的
    發表于 12-20 07:43

    I2C匯編程序

    I2C匯編程序:/*****;FileName: IicSMasU.a51;Describe: 51 系列模擬I2C 總線主控器驅動程序;Date: 2003/11/12
    發表于 03-02 23:38 ?35次下載

    51 系列匯編程序設計的優化1

    51 系列匯編程序設計的優化1
    發表于 05-15 14:55 ?24次下載

    如何在C程序中使用匯編

    怎樣C程序中使用匯編,如何在C程序
    發表于 09-23 23:43 ?55次下載

    KeilC51中C51程序匯編程序的接口方法

    C語言程序匯編語言程序的相互調用可視為函數的調用,只不過此函數是采用不同語言編寫。C
    發表于 07-09 17:49 ?74次下載

    PCF8563匯編程序

    剛寫的一個PCF8563匯編程序,請教高手!!!;***************************************************************;PCF8563時鐘
    發表于 08-19 17:41 ?90次下載

    匯編程序100例

    匯編程序100例,方便初學者快速的入門,加快掌握匯編語言。
    發表于 11-17 15:22 ?96次下載

    AD和DA轉換的c程序和對應的匯編程序

    有關AD和DA轉換的c程序和對應的匯編程序
    發表于 11-19 16:43 ?27次下載

    MSP430 C匯編程序

    MSP430 C匯編程序,有需要的朋友下來看看。
    發表于 05-25 10:26 ?22次下載

    lcd1602匯編程序,LCD1602匯編顯示程序代碼

    匯編語言書寫的程序翻譯成與之等價的機器語言程序的翻譯程序匯編程序輸入的是用匯編語言書寫的源
    發表于 10-20 15:34 ?1.5w次閱讀
    lcd1602<b class='flag-5'>匯編程序</b>,LCD1602<b class='flag-5'>匯編</b>顯示<b class='flag-5'>程序</b>代碼

    如何使用KEIL C51和proteus實現C51匯編程序的設計實例

    本文檔的主要內容詳細介紹的是如何使用KEIL C51和proteus實現C51匯編程序的設計實例。
    發表于 07-30 17:35 ?19次下載
    如何使用KEIL <b class='flag-5'>C</b>51和proteus實現<b class='flag-5'>C</b>51<b class='flag-5'>匯編程序</b>的設計實例

    C中直接使用匯編語句進行編程

    ? 一、gcc 內聯匯編 內聯匯編即在C中直接使用匯編語句進行編程,使程序可以
    的頭像 發表于 11-16 09:26 ?8219次閱讀
    主站蜘蛛池模板: 女配穿书病娇被强啪h| 麻豆成人啪啪色婷婷久久| 久久亚洲人成国产精品| 秋霞伦理电影在2017韩国在线伦| 无码AV精品久久一区二区免费| 一级特黄视频| 儿子操妈妈| 狼与美女谐音歌词| 小护士大pp| 成人国产精品视频频| 娇小亚裔被两个黑人| 日日天干夜夜狠狠爱| 真人做受120分钟免费看| 高清AV熟女一区| 免费精品国偷自产在线在线| 亚洲 综合 欧美在线 热| 插曲的痛30分钟视频最新章节| 久久婷婷国产五月综合色啪最新| 手机看片国产日韩欧美| 99欧美精品| 美女被黑人巨大进入| 伊人青青久久| 黄瓜视频苹果直接安装| 甜性涩爱dvd| 被高跟鞋调教丨vk| 欧美成人momandson| 879影视动漫h免费观看| 久久精品影视| 中国人泡妞www免费| 后入内射国产一区二区| 小荡娃奶真大| 国产色欲一区二区精品久久呦| 日韩精品一区VR观看| rio 快播| 日本妈妈JMZZZZZ| 东北嫖妓对白粗口| 色www.亚洲免费视频| 高清国语自产拍免费| 甜性涩爱免费下载| 国产精品无码亚洲网| 亚洲成年男人的天堂网|