0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)聯(lián)匯編代碼中的關(guān)鍵語法規(guī)則講解

GReq_mcu168 ? 來源:IOT物聯(lián)網(wǎng)小鎮(zhèn) ? 作者:道哥 ? 2021-09-05 09:46 ? 次閱讀

一、基本 asm 格式

1. 語法規(guī)則

2. test1.c 插入空指令

3. test2.c 操作全局變量

4. test3.c 嘗試操作局部變量

二、擴(kuò)展 asm 格式

1. 指令格式

2. 輸出和輸入操作數(shù)列表

3. test4.c 通過寄存器操作局部變量

4. test5.c 聲明使用的寄存器

三、使用占位符來代替寄存器名稱

1. test6.c 使用占位符代替寄存器名

2. test7.c 給寄存器起別名

四、使用內(nèi)存地址

1. test8.c 使用內(nèi)存地址來操作數(shù)據(jù)

五、總結(jié)

Linux 代碼中,經(jīng)常可以看到在 C 代碼中,嵌入部分匯編代碼,這些代碼要么是與硬件體系相關(guān)的,要么是對性能有關(guān)鍵影響的。

在很久以前,我特別懼怕內(nèi)嵌匯編代碼,直到后來把匯編部分的短板補上之后,才徹底終結(jié)這種心理。

也許你在工作中,幾乎不會涉及到內(nèi)嵌匯編代碼的工作,但是一旦進(jìn)入到系統(tǒng)的底層,或者需要對時間關(guān)鍵場景進(jìn)行優(yōu)化,這個時候你的知識儲備就發(fā)揮重要作用了!

這篇文章,我們就來詳細(xì)聊一聊在 C 語言中,如何通過 asm 關(guān)鍵字來嵌入?yún)R編語言代碼,文中的 8 個示例代碼從簡單到復(fù)雜,逐步深入地介紹內(nèi)聯(lián)匯編的關(guān)鍵語法規(guī)則。

希望這篇文章能夠成為你進(jìn)階高手路上的墊腳石!

PS:

示例代碼中使用的是 Linux 系統(tǒng)中 AT&T 匯編語法;

文章中的 8 個示例代碼,可以在公眾號后臺回復(fù)【426】,即可收到下載地址;

一、基本 asm 格式gcc 編譯器支持 2 種形式的內(nèi)聯(lián) asm 代碼:

基本 asm 格式:不支持操作數(shù);

擴(kuò)展 asm 格式:支持操作數(shù);

1. 語法規(guī)則

asm [volatile] (“匯編指令”)

所有指令,必須用雙引號包裹起來;

超過一條指令,必須用 分隔符進(jìn)行分割,為了排版,一般會加上 ;

多條匯編指令,可以寫在一行,也可以寫在多行;

關(guān)鍵字 asm 可以使用 asm 來替換;

volatile 是可選的,編譯器有可能對匯編代碼進(jìn)行優(yōu)化,使用 volatile 關(guān)鍵字之后,告訴編譯器不要優(yōu)化手寫的內(nèi)聯(lián)匯編代碼。

2. test1.c 插入空指令

#include 《stdio.h》

int main()

{

asm (“nop”);

printf(“hello

”);

asm (“nop

nop

“nop”);

return 0;

}

注意:C語言中會自動把兩個連續(xù)的字符串字面量拼接成一個,所以“nop nop ” “nop” 這兩個字符串會自動拼接成一個字符串。

生成匯編代碼指令:

gcc -m32 -S -o test1.s test1.c

test1.s 中內(nèi)容如下(只貼出了內(nèi)聯(lián)匯編代碼相關(guān)部分的代碼):

#APP

# 5 “test1.c” 1

nop

# 0 “” 2

#NO_APP

// 這里是 printf 語句生成的代碼。

#APP

# 7 “test1.c” 1

nop

nop

nop

# 0 “” 2

#NO_APP

可以看到,內(nèi)聯(lián)匯編代碼被兩個注釋(#APP 。.. #NO_APP)包裹起來。在源碼中嵌入了兩個匯編代碼,因此可以看到 gcc 編譯器生成的匯編代碼中包含了這兩部分代碼。

這 2 部分嵌入的匯編代碼都是空指令 nop,沒有什么意義。

3. test2.c 操作全局變量

在 C 代碼中嵌入?yún)R編指令,目的是用來計算,或者執(zhí)行一定的功能,下面我們就來看一下,如何在內(nèi)聯(lián)匯編指令中,操作全局變量。

#include 《stdio.h》

int a = 1;

int b = 2;

int c;

int main()

{

asm volatile (“movl a, %eax

addl b, %eax

“movl %eax, c”);

printf(“c = %d

”, c);

return 0;

}

關(guān)于匯編指令中編譯器的基本知識:

eax, ebx 都是 x86 平臺中的寄存器(32位),在基本asm格式中,寄存器的前面必須加上百分號%。

32 位的寄存器 eax 可以當(dāng)做 16 位來使用(ax),或者當(dāng)做 8 位來使用(ah, al),本文只會按照 32 位來使用。

代碼說明:

movl a, %eax // 把變量a的值復(fù)制到 %eax 寄存器中;

addl b, %eax // 把變量 b 的值 與 %eax 寄存器中的值(a)相加,結(jié)果放在 %eax 寄存器中;

movl %eax, c // 把 %eax 寄存器中的值復(fù)制到變量 c 中;

生成匯編代碼指令:

gcc -m32 -S -o test2.s test2.c

test2.s 內(nèi)容如下(只貼出與內(nèi)聯(lián)匯編代碼相關(guān)部分):

#APP

# 9 “test2.c” 1

movl a, %eax

addl b, %eax

movl %eax, c

# 0 “” 2

#NO_APP

可以看到,在內(nèi)聯(lián)匯編代碼中,可以直接使用全局變量 a, b 的名稱來操作。執(zhí)行 test2,可以得到正確的結(jié)果。

思考一個問題:為什么在匯編代碼中,可以使用變量a, b, c?

查看 test2.s 中內(nèi)聯(lián)匯編代碼之前的部分,可以看到:

.file“test2.c”

.globla

.data

.align 4

.typea, @object

.sizea, 4

a:

.long1

.globlb

.align 4

.typeb, @object

.sizeb, 4

b:

.long2

.commc,4,4

變量 a, b 被 .globl 修飾,c 被 .comm 修飾,相當(dāng)于是把它們導(dǎo)出為全局的,所以可以在匯編代碼中使用。

那么問題來了:如果是一個局部變量,在匯編代代碼中就不會用 .globl 導(dǎo)出,此時在內(nèi)聯(lián)匯編指令中,還可以直接使用嗎?

眼見為實,我們把這 3 個變量放到 main 函數(shù)的內(nèi)部,作為局部變量來試一下。

4. test3.c 嘗試操作局部變量

#include 《stdio.h》

int main()

{

int a = 1;

int b = 2;

int c;

asm(“movl a, %eax

“addl b, %eax

“movl %eax, c”);

printf(“c = %d

”, c);

return 0;

}

生成匯編代碼指令:

gcc -m32 -S -o test3.s test3.c

在 test3.s 中可以看到?jīng)]有 a, b, c 的導(dǎo)出符號,a 和 b 沒有其他地方使用,因此直接把他們的數(shù)值復(fù)制到??臻g中了:

movl$1, -20(%ebp)

movl$2, -16(%ebp)

我們來嘗試編譯成可執(zhí)行程序:

$ gcc -m32 -o test3 test3.c

/tmp/ccuY0TOB.o: In function `main‘:

test3.c undefined reference to `a’

test3.c undefined reference to `b‘

test3.c undefined reference to `c’

collect2: error: ld returned 1 exit status

編譯報錯:找不到對 a,b,c 的引用!那該怎么辦,才能使用局部變量呢?擴(kuò)展 asm 格式!

二、擴(kuò)展 asm 格式1. 指令格式

asm [volatile] (“匯編指令” : “輸出操作數(shù)列表” : “輸入操作數(shù)列表” : “改動的寄存器”)

格式說明

匯編指令:與基本asm格式相同;

輸出操作數(shù)列表:匯編代碼如何把處理結(jié)果傳遞到 C 代碼中;

輸入操作數(shù)列表:C 代碼如何把數(shù)據(jù)傳遞給內(nèi)聯(lián)匯編代碼;

改動的寄存器:告訴編譯器,在內(nèi)聯(lián)匯編代碼中,我們使用了哪些寄存器;

“改動的寄存器”可以省略,此時最后一個冒號可以不要,但是前面的冒號必須保留,即使輸出/輸入操作數(shù)列表為空。

關(guān)于“改動的寄存器”再解釋一下:gcc 在編譯 C 代碼的時候,需要使用一系列寄存器;我們手寫的內(nèi)聯(lián)匯編代碼中,也使用了一些寄存器。

為了通知編譯器,讓它知道: 在內(nèi)聯(lián)匯編代碼中有哪些寄存器被我們用戶使用了,可以在這里列舉出來,這樣的話,gcc 就會避免使用這些列舉出的寄存器

2. 輸出和輸入操作數(shù)列表的格式

在系統(tǒng)中,存儲變量的地方就2個:寄存器和內(nèi)存。因此,告訴內(nèi)聯(lián)匯編代碼輸出和輸入操作數(shù),其實就是告訴它:

向哪些寄存器或內(nèi)存地址輸出結(jié)果;

從哪些寄存器或內(nèi)存地址讀取輸入數(shù)據(jù);

這個過程也要滿足一定的格式:

“[輸出修飾符]約束”(寄存器或內(nèi)存地址)

(1)約束

就是通過不同的字符,來告訴編譯器使用哪些寄存器,或者內(nèi)存地址。包括下面這些字符:

a: 使用 eax/ax/al 寄存器;

b: 使用 ebx/bx/bl 寄存器;

c: 使用 ecx/cx/cl 寄存器;

d: 使用 edx/dx/dl 寄存器;

r: 使用任何可用的通用寄存器;

m: 使用變量的內(nèi)存位置;

先記住這幾個就夠用了,其他的約束選項還有:D, S, q, A, f, t, u等等,需要的時候再查看文檔。

(2)輸出修飾符

顧名思義,它使用來修飾輸出的,對輸出寄存器或內(nèi)存地址提供額外的說明,包括下面4個修飾符:

+:被修飾的操作數(shù)可以讀取,可以寫入;

=:被修飾的操作數(shù)只能寫入;

%:被修飾的操作數(shù)可以和下一個操作數(shù)互換;

&:在內(nèi)聯(lián)函數(shù)完成之前,可以刪除或者重新使用被修飾的操作數(shù);

語言描述比較抽象,直接看例子!

3. test4.c 通過寄存器操作局部變量

#include 《stdio.h》

int main()

{

int data1 = 1;

int data2 = 2;

int data3;

asm(“movl %%ebx, %%eax

“addl %%ecx, %%eax”

: “=a”(data3)

: “b”(data1),“c”(data2));

printf(“data3 = %d

”, data3);

return 0;

}

有 2 個地方需要注意一下?。?/p>

在內(nèi)聯(lián)匯編代碼中,沒有聲明“改動的寄存器”列表,也就是說可以省略掉(前面的冒號也不需要);

擴(kuò)展asm格式中,寄存器前面必須寫 2 個%;

代碼解釋:

“b”(data1),“c”(data2) ==》 把變量 data1 復(fù)制到寄存器 %ebx,變量 data2 復(fù)制到寄存器 %ecx。這樣,內(nèi)聯(lián)匯編代碼中,就可以通過這兩個寄存器來操作這兩個數(shù)了;

“=a”(data3) ==》 把處理結(jié)果放在寄存器 %eax 中,然后復(fù)制給變量data3。前面的修飾符等號意思是:會寫入往 %eax 中寫入數(shù)據(jù),不會從中讀取數(shù)據(jù);

通過上面的這種格式,內(nèi)聯(lián)匯編代碼中,就可以使用指定的寄存器來操作局部變量了,稍后將會看到局部變量是如何從經(jīng)過??臻g,復(fù)制到寄存器中的。

生成匯編代碼指令:

gcc -m32 -S -o test4.s test4.c

匯編代碼 test4.s 如下:

movl$1, -20(%ebp)

movl$2, -16(%ebp)

movl-20(%ebp), %eax

movl-16(%ebp), %edx

movl%eax, %ebx

movl%edx, %ecx

#APP

# 10 “test4.c” 1

movl %ebx, %eax

addl %ecx, %eax

# 0 “” 2

#NO_APP

movl%eax, -12(%ebp)

可以看到,在進(jìn)入手寫的內(nèi)聯(lián)匯編代碼之前:

把數(shù)字 1 通過??臻g(-20(%ebp)),復(fù)制到寄存器 %eax,再復(fù)制到寄存器 %ebx;

把數(shù)字 2 通過??臻g(-16(%ebp)),復(fù)制到寄存器 %edx,再復(fù)制到寄存器 %ecx;

這 2 個操作正是對應(yīng)了內(nèi)聯(lián)匯編代碼中的“輸入操作數(shù)列表”部分:“b”(data1),“c”(data2)。

在內(nèi)聯(lián)匯編代碼之后(#NO_APP 之后),把 %eax 寄存器中的值復(fù)制到棧中的 -12(%ebp) 位置,這個位置正是局部變量 data3 所在的位置,這樣就完成了輸出操作。

4. test5.c 聲明改動的寄存器

在 test4.c 中,我們沒有聲明改動的寄存器,所以編譯器可以任意選擇使用哪些寄存器。從生成的匯編代碼 test4.s 中可以看到,gcc 使用了 %edx 寄存器。

那么我們來測試一下:告訴 gcc 不要使用 %edx 寄存器。

#include 《stdio.h》

int main()

{

int data1 = 1;

int data2 = 2;

int data3;

asm(“movl %%ebx, %%eax

“addl %%ecx, %%eax”

: “=a”(data3)

: “b”(data1),“c”(data2)

: “%edx”);

printf(“data3 = %d

”, data3);

return 0;

}

代碼中,asm 指令最后部分 “%edx” ,就是用來告訴 gcc 編譯器:在內(nèi)聯(lián)匯編代碼中,我們會使用到 %edx 寄存器,你就不要用它了。

生成匯編代碼指令:

gcc -m32 -S -o test5.s test5.c

來看一下生成的匯編代碼 test5.s:

movl$1, -20(%ebp)

movl$2, -16(%ebp)

movl-20(%ebp), %eax

movl-16(%ebp), %ecx

movl%eax, %ebx

#APP

# 10 “test5.c” 1

movl %ebx, %eax

addl %ecx, %eax

# 0 “” 2

#NO_APP

movl%eax, -12(%ebp)

可以看到,在內(nèi)聯(lián)匯編代碼之前,gcc 沒有選擇使用寄存器 %edx。

三、使用占位符來代替寄存器名稱在上面的示例中,只使用了 2 個寄存器來操作 2 個局部變量,如果操作數(shù)有很多,那么在內(nèi)聯(lián)匯編代碼中去寫每個寄存器的名稱,就顯得很不方便。

因此,擴(kuò)展 asm 格式為我們提供了另一種偷懶的方法,來使用輸出和輸入操作數(shù)列表中的寄存器:占位符!

占位符有點類似于批處理腳本中,利用 2.。.來引用輸入?yún)?shù)一樣,內(nèi)聯(lián)匯編代碼中的占位符,從輸出操作數(shù)列表中的寄存器開始從 0 編號,一直編號到輸入操作數(shù)列表中的所有寄存器。

還是看例子比較直接!

1. test6.c 使用占位符代替寄存器

#include 《stdio.h》

int main()

{

int data1 = 1;

int data2 = 2;

int data3;

asm(“addl %1, %2

“movl %2, %0”

: “=r”(data3)

: “r”(data1),“r”(data2));

printf(“data3 = %d

”, data3);

return 0;

}

代碼說明:

輸出操作數(shù)列表“=r”(data3):約束使用字符 r, 也就是說不指定寄存器,由編譯器來選擇使用哪個寄存器來存儲結(jié)果,最后復(fù)制到局部變量 data3中;

輸入操作數(shù)列表“r”(data1),“r”(data2):約束字符r, 不指定寄存器,由編譯器來選擇使用哪 2 個寄存器來接收局部變量 data1 和 data2;

輸出操作數(shù)列表中只需要一個寄存器,因此在內(nèi)聯(lián)匯編代碼中的 %0 就代表這個寄存器(即:從 0 開始計數(shù));

輸入操作數(shù)列表中有 2 個寄存器,因此在內(nèi)聯(lián)匯編代碼中的 %1 和 %2就代表這 2 個寄存器(即:從輸出操作數(shù)列表的最后一個寄存器開始順序計數(shù));

生成匯編代碼指令:

gcc -m32 -S -o test6.s test6.c

匯編代碼如下 test6.s:

movl$1, -20(%ebp)

movl$2, -16(%ebp)

movl-20(%ebp), %eax

movl-16(%ebp), %edx

#APP

# 10 “test6.c” 1

addl %eax, %edx

movl %edx, %eax

# 0 “” 2

#NO_APP

movl%eax, -12(%ebp)

可以看到,gcc 編譯器選擇了 %eax 來存儲局部變量 data1,%edx 來存儲局部變量 data2 ,然后操作結(jié)果也存儲在 %eax 寄存器中。

是不是感覺這樣操作就方便多了?不用我們來指定使用哪些寄存器,直接交給編譯器來選擇。

在內(nèi)聯(lián)匯編代碼中,使用 %0、%1 、%2 這樣的占位符來使用寄存器。

別急,如果您覺得使用編號還是麻煩,容易出錯,還有另一個更方便的操作:擴(kuò)展 asm 格式還允許給這些占位符重命名,也就是給每一個寄存器起一個別名,然后在內(nèi)聯(lián)匯編代碼中使用別名來操作寄存器。

還是看代碼!

2. test7.c 給寄存器起別名

#include 《stdio.h》

int main()

{

int data1 = 1;

int data2 = 2;

int data3;

asm(“addl %[v1], %[v2]

“movl %[v2], %[v3]”

: [v3]“=r”(data3)

: [v1]“r”(data1),[v2]“r”(data2));

printf(“data3 = %d

”, data3);

return 0;

}

代碼說明:

輸出操作數(shù)列表:給寄存器(gcc 編譯器選擇的)取了一個別名 v3;

輸入操作數(shù)列表:給寄存器(gcc 編譯器選擇的)取了一個別名 v1 和 v2;

起立別名之后,在內(nèi)聯(lián)匯編代碼中就可以直接使用這些別名( %[v1], %[v2], %[v3])來操作數(shù)據(jù)了。

生成匯編代碼指令:

gcc -m32 -S -o test7.s test7.c

再來看一下生成的匯編代碼 test7.s:

movl$1, -20(%ebp)

movl$2, -16(%ebp)

movl-20(%ebp), %eax

movl-16(%ebp), %edx

#APP

# 10 “test7.c” 1

addl %eax, %edx

movl %edx, %eax

# 0 “” 2

#NO_APP

movl%eax, -12(%ebp)

這部分的匯編代碼與 test6.s 中完全一樣!

四、使用內(nèi)存位置在以上的示例中,輸出操作數(shù)列表和輸入操作數(shù)列表部分,使用的都是寄存器(約束字符:a, b, c, d, r等等)。

我們可以指定使用哪個寄存器,也可以交給編譯器來選擇使用哪些寄存器,通過寄存器來操作數(shù)據(jù),速度會更快一些。

如果我們愿意的話,也可以直接使用變量的內(nèi)存地址來操作變量,此時就需要使用約束字符 m。

1. test8.c 使用內(nèi)存地址來操作數(shù)據(jù)

#include 《stdio.h》

int main()

{

int data1 = 1;

int data2 = 2;

int data3;

asm(“movl %1, %%eax

“addl %2, %%eax

“movl %%eax, %0”

: “=m”(data3)

: “m”(data1),“m”(data2));

printf(“data3 = %d

”, data3);

return 0;

}

代碼說明:

輸出操作數(shù)列表 “=m”(data3):直接使用變量 data3 的內(nèi)存地址;

輸入操作數(shù)列表 “m”(data1),“m”(data2):直接使用變量 data1, data2 的內(nèi)存地址;

在內(nèi)聯(lián)匯編代碼中,因為需要進(jìn)行相加計算,因此需要使用一個寄存器(%eax),計算這個環(huán)節(jié)是肯定需要寄存器的。

在操作那些內(nèi)存地址中的數(shù)據(jù)時,使用的仍然是按順序編號的占位符。

生成匯編代碼指令:

gcc -m32 -S -o test8.s test8.c

生成的匯編代碼如下 test8.s:

movl$1, -24(%ebp)

movl$2, -20(%ebp)

#APP

# 10 “test8.c” 1

movl -24(%ebp), %eax

addl -20(%ebp), %eax

movl %eax, -16(%ebp)

# 0 “” 2

#NO_APP

movl-16(%ebp), %eax

可以看到:在進(jìn)入內(nèi)聯(lián)匯編代碼之前,把 data1 和 data2 的值放在了棧中,然后直接把棧中的數(shù)據(jù)與寄存器 %eax 進(jìn)行操作,最后再把操作結(jié)果(%eax),復(fù)制到棧中 data3 的位置(-16(%ebp))。

五、總結(jié)通過以上 8 個示例,我們把內(nèi)聯(lián)匯編代碼中的關(guān)鍵語法規(guī)則進(jìn)行了講解,有了這個基礎(chǔ),就可以在內(nèi)聯(lián)匯編代碼中編寫更加復(fù)雜的指令了。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3111

    瀏覽量

    75036
  • ASM
    ASM
    +關(guān)注

    關(guān)注

    1

    文章

    69

    瀏覽量

    19382
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4891

    瀏覽量

    70321

原文標(biāo)題:內(nèi)聯(lián)匯編很可怕嗎?看完這篇文章,終結(jié)它!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點推薦

    KiCad 的自定義規(guī)則(KiCon 演講)

    “ ?Seth Hillbrand 在 KiCon US 2025 上為大家介紹了 KiCad 的規(guī)則系統(tǒng),并詳細(xì)講解了自定義規(guī)則的設(shè)計與實例。? ” ? 演講主要圍繞 加強(qiáng) KiCad
    的頭像 發(fā)表于 06-16 11:17 ?58次閱讀
    KiCad <b class='flag-5'>中</b>的自定義<b class='flag-5'>規(guī)則</b>(KiCon 演講)

    MSP430常用內(nèi)聯(lián)函數(shù)說明

    電子發(fā)燒友網(wǎng)站提供《MSP430常用內(nèi)聯(lián)函數(shù)說明.docx》資料免費下載
    發(fā)表于 06-05 17:20 ?0次下載

    芯片設(shè)計的設(shè)計規(guī)則檢查

    設(shè)計規(guī)則檢查(Design Rule Check,簡稱DRC)是芯片設(shè)計的一個關(guān)鍵步驟,旨在確保電路設(shè)計的物理布局符合制造工藝的要求。可以把它類比為建筑設(shè)計的檢查流程,確保建筑圖紙
    的頭像 發(fā)表于 03-04 14:58 ?446次閱讀

    EE-32:語言擴(kuò)展:內(nèi)存存儲類型、ASM和內(nèi)聯(lián)構(gòu)造

    電子發(fā)燒友網(wǎng)站提供《EE-32:語言擴(kuò)展:內(nèi)存存儲類型、ASM和內(nèi)聯(lián)構(gòu)造.pdf》資料免費下載
    發(fā)表于 01-14 15:03 ?0次下載
    EE-32:語言擴(kuò)展:內(nèi)存存儲類型、ASM和<b class='flag-5'>內(nèi)聯(lián)</b>構(gòu)造

    EE-134:為SHARC系列編寫C兼容匯編代碼中斷處理程序

    電子發(fā)燒友網(wǎng)站提供《EE-134:為SHARC系列編寫C兼容匯編代碼中斷處理程序.pdf》資料免費下載
    發(fā)表于 01-07 13:58 ?0次下載
    EE-134:為SHARC系列編寫C兼容<b class='flag-5'>匯編</b><b class='flag-5'>代碼</b>中斷處理程序

    關(guān)于歐盟法規(guī)測試場景的研究

    關(guān)于歐盟法規(guī)測試場景的研究 1.引言 ? 場景是智能網(wǎng)聯(lián)汽車測試技術(shù)的基礎(chǔ),基于場景的功能測試方法對于彌補基于里程的測試方法的局限性,提高系統(tǒng)開發(fā)效率、產(chǎn)品落地效率等方面都有重要作用。在眾多的場景
    的頭像 發(fā)表于 11-25 16:32 ?1049次閱讀
    關(guān)于歐盟<b class='flag-5'>法規(guī)</b><b class='flag-5'>中</b>測試場景的研究

    SQL錯誤代碼及解決方案

    在SQL數(shù)據(jù)庫開發(fā)和管理,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但
    的頭像 發(fā)表于 11-19 10:21 ?6235次閱讀

    Verilog語法運算符的用法

    verilog語法中使用以下兩個運算符可以簡化我們的位選擇代碼。
    的頭像 發(fā)表于 10-25 15:17 ?2373次閱讀
    Verilog<b class='flag-5'>語法</b><b class='flag-5'>中</b>運算符的用法

    Lua語法基礎(chǔ)教程(上篇)

    今天我們來學(xué)習(xí)Lua語法基礎(chǔ)教程。由于篇幅過長,將分為上中下三篇進(jìn)行講解,本篇為上篇。 一、初識Lua Lua 是一種輕量小巧的腳本語言,它用標(biāo)準(zhǔn)C語言編寫并以源代碼形式開放。這意味著什么呢?這
    的頭像 發(fā)表于 10-24 07:17 ?744次閱讀

    TMS320LF240x DSP的C語言和匯編代碼快速入門

    電子發(fā)燒友網(wǎng)站提供《TMS320LF240x DSP的C語言和匯編代碼快速入門.pdf》資料免費下載
    發(fā)表于 10-18 10:14 ?1次下載
    TMS320LF240x DSP的C語言和<b class='flag-5'>匯編</b><b class='flag-5'>代碼</b>快速入門

    hex可以轉(zhuǎn)成源代碼

    ,可以通過以下幾種方法嘗試獲取源代碼的近似形式: 反匯編 : 使用反匯編工具可以將Hex文件的機(jī)器碼轉(zhuǎn)換回匯編語言。
    的頭像 發(fā)表于 09-02 10:41 ?2108次閱讀

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十五)

    一、不支持for … in 規(guī)則:arkts-no-for-in 級別:錯誤 由于在ArkTS,對象布局在編譯時是確定的、并且不能在運行時被改變,所以不支持使用for … in迭代一個對象的屬性
    發(fā)表于 08-19 16:13

    TestStand表達(dá)式中常用的語法規(guī)則和運算符使用

    TestStand也有自己的語言嘛?在回答這個問題之前大家可以想一下在使用TestStand時有一個和語言密切相關(guān)的屬性。沒錯那就是表達(dá)式(Expressions),在這篇文章,小編將以Q&A的方式來帶著大家來理解并熟悉TestStand表達(dá)式較為常用的一些
    的頭像 發(fā)表于 08-15 18:10 ?3215次閱讀
    TestStand表達(dá)式中常用的<b class='flag-5'>語法規(guī)則</b>和運算符使用

    HarmonyOS Next原生應(yīng)用開發(fā)-從TS到ArkTS的適配規(guī)則(十一)

    (); // Extra foo 二、類型轉(zhuǎn)換僅支持as T語法 規(guī)則:arkts-as-casts 級別:錯誤 在ArkTS,as關(guān)鍵字是類型轉(zhuǎn)換的唯一
    發(fā)表于 08-02 14:07

    HarmonyOS Next 原生應(yīng)用開發(fā)-ArkTS語法適配背景說明

    助于更好地優(yōu)化性能。三、.ets代碼兼容性 在API version 10之前,ArkTS(.ets文件)完全采用了標(biāo)準(zhǔn)TS的語法。從API version 10 Release起,ArkTS的語法規(guī)則
    發(fā)表于 07-01 16:49

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品