偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

入門(mén)匯編語(yǔ)言的五大技巧

開(kāi)發(fā) 后端
本文使用RISC-V 為例來(lái)向大家展示,來(lái)如何使用編寫(xiě)語(yǔ)言設(shè)計(jì)程序邏輯,并最終將程序邏輯轉(zhuǎn)換為匯編語(yǔ)言的程序。

編程是門(mén)藝術(shù),大多數(shù)開(kāi)發(fā)者實(shí)際工作中只是開(kāi)發(fā)App,正常來(lái)說(shuō)是不會(huì)接觸到匯編的,主要有兩大原因,一來(lái)編譯語(yǔ)言不容易學(xué)習(xí),二來(lái),日常生活中比較少用到。

匯編語(yǔ)言是最古老的編程語(yǔ)言,在所有的語(yǔ)言中,它與原生機(jī)器語(yǔ)言最為接近。它能直接訪問(wèn)計(jì)算機(jī)硬件,要求用戶了解計(jì)算機(jī)架構(gòu)和操作系統(tǒng)。學(xué)習(xí)匯編最大的用處就是可以幫助我們更好地理解高級(jí)語(yǔ)言,因此還是很有必要的,

本文使用RISC-V 為例來(lái)向大家展示,來(lái)如何使用編寫(xiě)語(yǔ)言設(shè)計(jì)程序邏輯,并最終將程序邏輯轉(zhuǎn)換為匯編語(yǔ)言的程序。

用合適的語(yǔ)言設(shè)計(jì)邏輯

這是最難的一步,許多學(xué)生想直接編寫(xiě)完整的功能模塊的軟件包。但是,如果你不喜歡匯編,那么這是一種注定要失敗的方法,相反,為了把邏輯從語(yǔ)言中分離出來(lái),我們必須用我們能理解的語(yǔ)言來(lái)寫(xiě)。

如果一個(gè)學(xué)生不懂C語(yǔ)言或一些低級(jí)語(yǔ)言,那么我建議他們用偽代碼來(lái)寫(xiě)。太高級(jí)的語(yǔ)言編譯困難,而太低級(jí)的語(yǔ)言又會(huì)講邏輯設(shè)計(jì)困難,所以,推薦使用C/C++或其他類似的語(yǔ)言。

在翻譯時(shí),有些編輯器可以把它們并排放在一起,這是很有幫助的。因?yàn)樵诖竽X中保留一份指令列表是很困難的,特別是當(dāng)你在編譯一個(gè)復(fù)雜的程序時(shí)。

一步一個(gè)腳印

許多學(xué)生試圖從頭到尾編寫(xiě)整個(gè)程序,而中間沒(méi)有測(cè)試任何內(nèi)容。如果是初學(xué)者,我建議用增量式編程,關(guān)鍵是在完成一部分邏輯時(shí)進(jìn)行測(cè)試。這可以像完成一個(gè)for循環(huán)就進(jìn)行測(cè)試。

測(cè)試的一種方法是將C/C++程序與匯編程序連接在一起,你可以通過(guò)在C++中創(chuàng)建函數(shù)程序集的原型并在兩者之間切換來(lái)實(shí)現(xiàn)這一點(diǎn)。你需要確保兩者是不同的,否則鏈接會(huì)出錯(cuò),按照一般的做法通常會(huì)在C函數(shù)前面加上一個(gè)“c”來(lái)區(qū)分。我們可以調(diào)用Show來(lái)運(yùn)行匯編語(yǔ)言編寫(xiě)的函數(shù):

  1. extern "C" { // Turn off name mangling 
  2.     void show(int *x); 

extern " C "將告訴c++函數(shù)遵循C的"調(diào)用約定"。我們真正關(guān)心的是關(guān)閉名稱修改,這樣我們就可以創(chuàng)建一個(gè)名為“show”的標(biāo)簽,并擁有我們的函數(shù)。

了解匯編語(yǔ)言的功能定位

正如巨石強(qiáng)森(Dwayne Johnson)常說(shuō)的那樣:“認(rèn)清自己的角色”。知道C/ C++為我們做了什么和程序集沒(méi)有為我們做什么是很重要的。。例如,4 + 3 * 4將自動(dòng)將運(yùn)算排序?yàn)橄葓?zhí)行乘法,再執(zhí)行加法。然而,在匯編中,我們必須先選擇乘法指令,然后再選擇加法指令。

知道如何調(diào)用函數(shù)

大多數(shù)ISA架構(gòu)都會(huì)附帶調(diào)用約定手冊(cè),比如ARM和RISC-V。這些只是為在所有語(yǔ)言中調(diào)用函數(shù)制定了一些基本規(guī)則。不過(guò)幸運(yùn)的是RISC-V寄存器的 “ABI” 命名規(guī)則,有助于程序員理解它們的含義。比如:

  • 整數(shù)參數(shù)在寄存器 A0-A7 中,浮點(diǎn)參數(shù)在寄存器 FA0-FA7 中
  • 通過(guò)對(duì)堆棧指針的 sub 操作去分配函數(shù)堆棧。在調(diào)用完成后使用 add 操作進(jìn)行銷(xiāo)毀
  • 堆棧大小必須以 8 的整數(shù)倍形式分配
  • 所有參數(shù)和臨時(shí)寄存器必須在函數(shù)調(diào)用后,被視為銷(xiāo)毀態(tài)
  • 在函數(shù)調(diào)用之后,已保存寄存器才能被顯式保存。如果使用了任何已保存的寄存器,則必須在函數(shù)返回之前還原它們的原始值
  • 通過(guò) a0 寄存器做為返回值,將數(shù)據(jù)返回給調(diào)用方。
  1. .global main 
  2. main: 
  3.     addi    sp, sp, -8 
  4.     sd      ra, 0(sp) 
  5.     la      a0, test_solve 
  6.     call    solve 
  7.     mv      a0, zero 
  8.     ld      ra, 0(sp) 
  9.     addi    sp, sp, 8 
  10.     ret 

你可以從上面的代碼中看到,我們首先分配我們的堆??蚣?,保存所有需要保存的寄存器,執(zhí)行,然后在返回之前撤消的所有寄存器。

文檔

用C或其他語(yǔ)言編寫(xiě)匯編代碼會(huì)讓你為每一行C代碼編寫(xiě)多行匯編代碼。如果你試圖調(diào)試程序,這可能會(huì)讓你有些難度,所以,我總是寫(xiě)C代碼作為匯編的注釋,然后把它拆開(kāi),并展示我做它的每一步。

你可以從上面的代碼中看到,我有原始的C代碼(第一個(gè)注釋),然后對(duì)每個(gè)片段進(jìn)行內(nèi)聯(lián)注釋。這樣的方式使我們能夠保證程序可以正確地執(zhí)行每一步。

 

責(zé)任編輯:趙寧寧 來(lái)源: 程序員書(shū)庫(kù)
相關(guān)推薦

2019-04-12 10:03:38

云端數(shù)據(jù)集成數(shù)字化

2010-08-05 14:16:37

路由器配置

2011-01-14 14:08:17

Linux匯編語(yǔ)言

2010-07-14 17:03:52

編程語(yǔ)言

2011-01-14 14:39:32

Linux匯編語(yǔ)言

2012-02-09 09:00:54

匯編語(yǔ)言

2012-05-29 09:59:34

2014-02-18 09:37:54

政府云計(jì)算

2019-06-04 10:40:07

2013-11-26 09:10:26

優(yōu)化網(wǎng)絡(luò)基礎(chǔ)設(shè)施技巧

2024-12-31 08:03:12

2013-12-19 13:35:13

開(kāi)源社區(qū)開(kāi)源軟件

2011-01-14 14:15:11

Linux匯編語(yǔ)言

2011-01-04 17:08:10

匯編語(yǔ)言

2010-07-15 09:56:58

Perl語(yǔ)言

2024-03-12 12:05:57

2011-06-22 10:14:49

JVM

2010-07-13 10:05:54

Perl語(yǔ)言

2013-09-02 10:15:42

云備份云存儲(chǔ)云安全

2011-01-14 14:22:50

Linux匯編語(yǔ)言
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)