《匯編語言:基于X86處理器》第13章 復習題和編程練習

本篇記錄了《匯編語言:基于X86處理器》第13章 復習題和編程練習的學習筆記。

13.6 復習題

1.當匯編過程被高級語言程序調用時,主調程序與被調過程是否應使用相同的內存模式?

答:主調程序與被調過程使用的內存模式必須相同。

2.C 和 C++程序調用匯編過程時,為什么區分大小寫是很重要的?

答:C和C++編譯器編譯時是區分大小寫的,所以如果調用匯編過程必須區分大小寫,這樣才能正確調用相應的匯編過程。

3.一種編程語言的調用規范是否包括了過程對某些寄存器的保存規定?

答:是的

4.(是/否):EVEN 和ALIGN偽指令是否都能用于內嵌匯編代碼?

答:是

5.(是/否):OFFSET運算符是否能用于內嵌匯編代碼?

答:否

6.(是/否):內嵌匯編代碼中,DW和DUP運算符是否都能用于變量定義?

答:否

7.使用 fastcall調用規范時,若內嵌匯編代碼修改了寄存器會出現什么情況?

答:_fastcall會使用編譯器用寄存器來傳遞參數,會引起寄存器沖突,使用程序會結果錯亂。

8.不使用OFFSET運算符,是否還有其他方法能把變量偏移量送入變址寄存器?

答:要以使用LEA指令得到變量偏移地址。例如 :lea esi,buffer ;將buffer的偏移地址送入ESI.

9.對 32位整數數組使用 LENGTH運算符,其返回值是多少?

答:LENGTH的返回值是數組的元素個數(與每個元素的大小無關 )

10.對長整型數組使用SIZE運算符,其返回值是多少?

答:返回值是元素的個數*單個元素的大小。LENGTH array * TYPE long

11.標準C printf()函數的有效匯編PROTO 聲明是怎樣的?

答:printf PROTO C, pString:PTR BYTE, args:VARARG

12.調用如下C語言函數,實參x是最先入棧還是最后入棧?

void MySub( x, y, z);

答:X是最后入棧,調用C語言函數時,是從右向左逆向入棧。

13.過程被 C++調用時,其外部聲明使用的“C”說明符有什么作用?

答:防止c++的名稱修飾。從匯編語言程序員的角度來看,名稱修飾存在的問題是:C++編譯器讓鏈接器去找的是修飾過的名稱,而不是生成可執行文件時的原始名稱。

14.C++調用外部匯編過程時,為什么名稱修飾是重要的?

答:C++編譯器編譯代碼時會對函數名稱進行修飾,例如:sub()函數編譯時可能變成了_sub()函數,如果不使用名稱修飾就會找不到對應的原始名稱。

15.搜索互聯網,用簡表列出C/C++編譯器使用的優化技巧。

答:

1. 高級優化

內聯展開(Inline Expansion)
將小函數調用替換為函數體本身,減少調用開銷(如-finline-functions)。

循環展開(Loop Unrolling)
減少循環控制開銷,通過重復循環體(如#pragma unroll-funroll-loops)。

常量傳播(Constant Propagation)
將常量表達式替換為計算結果(如int x = 3 * 5;int x = 15;)。

死代碼消除(Dead Code Elimination)
刪除不可達的代碼(如未使用的變量或條件分支)。

函數返回值優化(RVO/NRVO)
避免臨時對象的復制(直接構造返回值到目標內存)。

2. 循環優化

循環不變代碼外提(Loop Invariant Code Motion)
將循環內不變的表達式移到循環外。

循環融合(Loop Fusion)
合并相鄰的循環以減少迭代次數。

循環分塊(Loop Tiling)
優化內存訪問局部性(尤其對多維數組)。

3. 內存與指針優化

別名分析(Alias Analysis)
推斷指針是否指向同一內存區域(如restrict關鍵字)。

標量替換(Scalar Replacement)
將數組元素替換為局部變量(減少內存訪問)。

寫緩沖優化(Write Buffering)
合并多次內存寫入操作。

4. 指令級優化

指令調度(Instruction Scheduling)
重新排列指令以避免CPU流水線停頓。

自動向量化(Auto-Vectorization)
使用SIMD指令(如SSE/AVX)并行化計算(-mavx)。

分支預測優化(Branch Prediction)
通過重排代碼提高分支預測命中率(如likely/unlikely宏)。

5. 鏈接時優化(LTO, Link-Time Optimization)

跨編譯單元優化(如-flto),允許內聯和刪除未使用的全局函數。

6. 其他常見優化

尾調用優化(Tail Call Optimization)
將遞歸尾調用轉為循環(避免棧溢出)。

公共子表達式消除(CSE)
重復計算的表達式只計算一次。

強度削減(Strength Reduction)
用低成本操作替換高成本操作(如乘法→加法)。

編譯器標志示例(GCC/Clang)

-O1:基礎優化(如常量傳播、死代碼消除)。

-O2:激進優化(包括向量化、循環展開)。

-O3:最高級優化(可能增加代碼體積)。

-Os:優化代碼大小。

-Ofast:激進優化,忽略嚴格標準合規性。

注意事項

調試與優化沖突:高優化級別可能導致調試信息不準確(如變量被優化掉)。

未定義行為(UB):依賴UB的代碼可能被激進優化破壞(如指針越界)。

性能權衡:某些優化(如循環展開)可能增加代碼體積,需根據場景選擇。

編譯器通過組合這些技術,在保證語義一致性的前提下最大化性能。實際效果可通過反匯編(objdump -d或編譯器資源管理器)驗證。

13.7編程練習

**1.數組與整數相乘

編寫匯編子程序,實現一個雙字數組與一個整數的乘法。編寫C/C++測試程序,新建數組并將其傳遞給子程序,再輸出運算后的結果數組。

頭文件

#pragma once    //  防止頭文件被重復包含,   非標準(但廣泛支持)
//ArrayMul.h   對應的匯編語言文件ArrayMul.asm    C++測試文件13.7_1.cpp    extern "C" {void ArrayMul(int n, int array[], unsigned count);// Assembly language module
}

匯編語言實現文件

;ArrayMul函數    ArrayMul.asm    C++測試文件13.7_1.cpp    .586
.model flat, C
ArrayMul PROTO,intVal:DWORD, arrayPtr:PTR DWORD, count:DWORD.code 
;數組乘以同一個整數。返回:無
ArrayMul PROC USES ecx esi edi,intVal:DWORD, arrayPtr:PTR DWORD, count:DWORDmov ecx, count				        ;數組大小mov esi, arrayPtr				    ;數組指針mov edi, 0					L1:	mov eax, [esi+edi*4]mul intVal						    ;乘以同一個整數mov [esi+edi*4], eaxinc edi								;下一個數loop L1ret
ArrayMul ENDP 
END

C++測試文件

//13.7_1.cpp      13.7編譯練習      **1.數組與整數相乘
//編寫匯編子程序,實現一個雙字數組與一個整數的乘法。
//編寫C / C++測試程序,新建數組并將其傳遞給子程序,再輸出運算后的結果數組。#include <iostream>
#include <time.h>
#include "ArrayMul.h"
using namespace std;int main()
{const int ARRAY_SIZE = 10;int array[ARRAY_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};for (unsigned i = 0; i < ARRAY_SIZE; i++)printf("%d\t", array[i]);cout << endl;int intVal;cout << "Enter an integer value: ";cin >> intVal;ArrayMul(intVal,   array,  ARRAY_SIZE);for (unsigned i = 0; i < ARRAY_SIZE; i++)printf("%d\t", array[i]);cout << endl;return 0;
}

運行調試:

***2.最長遞增序列

編寫匯編子程序,接收兩個輸人參數:數組偏移量和數組大小。子程序返回數組中最長的遞增序列中整數值的個數。比如,數組如下所示,則最長的嚴格遞增序列開始于索引值為3的元素、序列長度為4{14,17、26、42}:

[-5,10,20,14,17,26,42、22,19,-5]

編寫 C/C++測試程序調用該子程序,測試程序實現的操作包括:新建數組、傳遞參數、輸出子程序的返回值。

頭文件:LongestSelfIncSeq.h

#pragma once    //  防止頭文件被重復包含,   非標準(但廣泛支持)
//LongestSelfIncSeq.h   對應的匯編語言文件LongestSelfIncSeq.asm    C++測試文件13.7_2.cpp    extern "C" {int LongestSelfIncSeq(int array[], unsigned count);// Assembly language module
}

匯編實現文件: LongestSelfIncSeq.asm

;LongestSelfIncSeq函數    LongestSelfIncSeq.asm    C++測試文件13.7_2.cpp    .586
.model flat, C
LongestSelfIncSeq PROTO,arrayPtr:PTR DWORD, count:DWORD.code 
;查找數組中最長的遞增序列中整數值的個數。返回:eax為最長遞增序列的個數
LongestSelfIncSeq PROC USES ecx esi edi,arrayPtr:PTR DWORD, count:DWORDlocal counter:DWORDlocal position: dwordmov counter, 0mov esi, arrayPtr					;數組的起始地址mov edi, arrayPtradd edi, TYPE DWORD					;第2個元素   用以相臨元素的比較是否自增mov ecx, count					    ;數組大小mov edx, 0							;設置計數器L1:	mov eax,  [esi]mov ebx,  [edi]cmp ebx, eax						;比較相臨兩個元素是否遞增jl L2								;ebx < eax   有符號比較:小于跳轉L2inc edx								;否則ebx > eax, 遞增序列的個數自增jmp L3L2:										;此處EDX中的當前計數器與counter中先前保存的值進行了比較mov eax, countercmp edx, eaxjb L3								;無符號比較:小于跳轉L3,如果EDX中的當前值大于之前保存在 counter中的值,則EDX將保存在計數器中mov counter, edx					;保存最長遞增序列的長度mov position, esi					;保存最長序列最后一個成員的索引mov edx, 0
L3:add esi, TYPE DWORD				    ;下一個元素add edi, TYPE DWORDloop L1mov eax, counterinc eaxret
LongestSelfIncSeq ENDP 
END

C++測試文件:13.7_2.cpp

//13.7_2.cpp      13.7編譯練習     ***2.最長遞增序列
//編寫匯編子程序,接收兩個輸人參數:數組偏移量和數組大小。子程序返回數組中最長的遞增序列中整數值的個數。
//比如,數組如下所示,則最長的嚴格遞增序列開始于索引值為3的元素、序列長度為4{ 14,17、26、42 } :
//	[-5,10,20,14,17,26,42、22,19, - 5]
//編寫 C / C++測試程序調用該子程序,測試程序實現的操作包括 : 新建數組、傳遞參數、輸出子程序的返回值。#include <iostream>
#include <time.h>
#include "LongestSelfIncSeq.h"using namespace std;int main()
{int array[10] = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 };int num = LongestSelfIncSeq(array, sizeof(array) / 4);printf("Reslut is: %d\n", num);return 0;
}

運行調試:

**3.三個數組求和

編寫匯編子程序。接收三個同樣大小數組的偏移量。將第二個和第三個數組加到第一個數組上。子程序返回時,第一個數組包含結果數值。編寫 C/C++測試程序,新建數組并將其傳遞給子程序,再顯示第一個數組的內容。

頭文件:ArraySum.h

#pragma once    //  防止頭文件被重復包含,   非標準(但廣泛支持)
//ArraySum.h   對應的匯編語言文件ArraySum.asm    C++測試文件13.7_3.cpp    extern "C" {void ArraySum(int array1[], int array2[], int array3[], unsigned count);// Assembly language module
}

匯編文件ArraySum.asm

;ArraySum函數    ArraySum.asm    C++測試文件13.7_3.cpp    .586
.model flat, C
ArraySum PROTO,arrayPtr1:PTR DWORD, arrayPtr1:PTR DWORD, arrayPtr3:PTR DWORD, count:DWORD.code 
;把第2個數組與第3個數組相加,和放在第1個數組。返回:無
ArraySum PROC USES ecx esi edi ebx edx,arrayPtr1:PTR DWORD, arrayPtr2:PTR DWORD, arrayPtr3:PTR DWORD, count:DWORDmov ecx, count							;數組大小mov esi, arrayPtr2						;數組指針mov edi, arrayPtr3mov edx, arrayPtr1mov ebx, 0L1:	mov eax, [esi + ebx*4]add eax,  [edi + ebx*4]					;相加mov [edx + ebx*4], eaxinc ebx									;下一個數loop L1ret
ArraySum ENDP 
END

C++測試文件:

//13.7_3.cpp      13.7編譯練習      **3.三個數組求和
//編寫匯編子程序。接收三個同樣大小數組的偏移量。將第二個和第三個數組加到第一個數組上。
//子程序返回時,第一個數組包含結果數值。編寫 C / C++測試程序,新建數組并將其傳遞給子程序,
//再顯示第一個數組的內容。#include <iostream>
#include <time.h>
#include "ArraySum.h"
using namespace std;int main()
{const int ARRAY_SIZE = 10;int array1[ARRAY_SIZE] = { 0 };int array2[ARRAY_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int array3[ARRAY_SIZE] = { 11,12, 13, 14, 15, 16, 17, 18, 19, 20 };cout << "array 2: " << endl;for (unsigned i = 0; i < ARRAY_SIZE; i++)printf("%d\t", array2[i]);cout << endl;cout << "array 3: " << endl;for (unsigned i = 0; i < ARRAY_SIZE; i++)printf("%d\t", array3[i]);cout << endl;cout << "array1 = array2 + array3: " << endl;ArraySum(array1, array2, array3, ARRAY_SIZE);for (unsigned i = 0; i < ARRAY_SIZE; i++)printf("%d\t", array1[i]);cout << endl;cout << endl;return 0;
}

運行調試:

***4.質數程序

編寫匯編過程實現如下功能:若傳遞給EAX 的 32 位整數為質數,則返回1;若 EAX 為非質數,則返回 0。要求從高級語言程序調用該過程。由用戶輸入一組整數,對每個數值,程序都要顯示一條信息以示該數是否為質數。建議:第一次調用該過程時,使用厄拉多塞過濾算法(Sieve ofEratosthenes)初始化布爾數組。

頭文件:isPrime.h

#pragma once    //  防止頭文件被重復包含,   非標準(但廣泛支持)
//isPrime.h   對應的匯編語言文件isPrime.asm    C++測試文件13.7_4.cpp    extern "C" {int isPrime(unsigned intVal);// Assembly language module
}

匯編語言過程實現文件:isPrime.asm

;isPrime函數    isPrime.asm    C++測試文件13.7_4.cpp    .586
.model flat, C
isPrime PROTO,intVal:DWORD .code 
;判斷是否為素數。返回:是素數eax為1, 不是素數eax為0
isPrime PROC USES ecx edx,intVal:DWORDmov eax, intValcmp eax, 1je isNotcmp eax, 2					    ;2是最小的素數je stopmov ecx, intValsub ecx, 2						;1和本身略過mov ebx, intValdec ebxL1:	mov edx, 0mov eax, intValdiv ebx							;商在eax中,余數在edx中cmp edx, 0je isNotcmp ecx, 1je stopdec ebxloop L1
stop:mov eax, 1ret
isNot:mov eax, 0ret
isPrime ENDP 
END

C++測試文件:13.7_4.cpp

//13.7_4.cpp      13.7編譯練習     ***4.質數程序
//編寫匯編過程實現如下功能:若傳遞給EAX 的 32 位整數為質數,則返回1; 若 EAX 為非質數,則返回 0。
//要求從高級語言程序調用該過程。由用戶輸入一組整數,對每個數值,程序都要顯示一條信息以示該數是否為質數。
//建議:第一次調用該過程時,使用厄拉多塞過濾算法(Sieve ofEratosthenes)初始化布爾數組。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "isPrime.h"
using namespace std;int main()
{int array[6] = { 0 };printf("Please input six integers:\n");for (unsigned i = 0; i < 6; i++)scanf("%d", &array[i]);printf("\n");for (unsigned i = 0; i < 6; i++){if (isPrime(array[i]))printf("%d is prime\n", array[i]);elseprintf("%d is not prime\n", array[i]);}printf("\n");return 0;
}

運行調試:

*5.LastindexOf過程

修改13.3.1 節的 IndexOf 過程。將新函數命名為LastlndexOf,使其從數組末尾開始反向搜索。遇到第一個匹配值就返回其索引,否則即為未發現匹配值,返回-1。

.h頭文件

#pragma once    //  防止頭文件被重復包含,   非標準(但廣泛支持)
// indexof.h   對應的匯編語言文件IndexOf.asm    C++測試文件13.7_5.cpp    extern "C" {long IndexOf(long n, long array[], unsigned count);// Assembly language module
}

匯編實現文件

;IndexOf函數    IndexOf.asm    C++測試文件13.7_5.cpp    .586
.model flat, C
IndexOf PROTO,srchVal:DWORD, arrayPtr:PTR DWORD, count:DWORD.code 
;---------------------------------------------------------------
IndexOf PROC USES ecx esi edi,srchVal:DWORD, arrayPtr:PTR DWORD, count:DWORD
;
;對32位整數數組執行線性搜索——從后往前搜索
;尋找指定數值。如果發現匹配數值
;用EAX返回該數值的索引位置
;否則,EAX返回-1.
;----------------------------------------------------------------NOT_FOUND = -1mov eax, srchVal				;搜索數值mov ecx, count				    ;數組大小mov esi, arrayPtr				;數組指針mov edi, count					;索引到最后dec edi							;最后一個元素的索引(數組從0開始)L1:	cmp [esi+edi*4], eaxje founddec edi							;從后往前索引loop L1notFound:mov eax, NOT_FOUNDjmp short exitfound:mov eax, ediexit:ret
IndexOf ENDP 
END

C++測試文件

//13.7_5.cpp      13.7編譯練習      *5.LastindexOf過程
//修改13.3.1 節的 IndexOf 過程。將新函數命名為LastlndexOf,使其從數組末尾開始反向搜索。
//遇到第一個匹配值就返回其索引,否則即為未發現匹配值,返回 - 1。
#include <iostream>
#include <time.h>
#include "indexof.h"
using namespace std;int main(){//用偽隨機數填充數組。const unsigned ARRAY_SIZE = 100000;const unsigned LOOP_SIZE = 100000;const char* boolstr[] = { "false","true" };long array[ARRAY_SIZE];for (unsigned i = 0; i < ARRAY_SIZE; i++)array[i] = rand() % 50000;long searchVal;time_t startTime, endTime;cout << "Enter an integer value to find: ";cin >> searchVal;cout << "Please wait...\n";//測試匯編函數time(&startTime);long index = 0;for (unsigned n = 0; n < LOOP_SIZE; n++)index = IndexOf( searchVal, array, ARRAY_SIZE );bool found = index != -1;time(&endTime);cout << "Elapsed ASM time: " << long(endTime - startTime)<< " seconds. Found = " << boolstr[found] << endl;return 0;
}

運行調試:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/918659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/918659.shtml
英文地址,請注明出處:http://en.pswp.cn/news/918659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SpringAI智能航空助手實戰<Demo>

我們將如何將我們得傳統業務進行智能化的改造>>>1.將我們傳統的航空票務系統 我們之前通過按鈕的方式來完成 現在我們通過智能對話的方式完成 >現在我們通過對話的方式來完成 整個智能化的改造 傳統應用如何進行智能化改造 我們把我們的項目通過Spring-ai 來接入A…

windows git安裝步驟

1&#xff0c;從官網下載安裝包&#xff1a;gitg官網 進行安裝 2&#xff0c;配置git環境&#xff1a; git config --global user.name "Your Name" git config --global user.email "Your Email"3&#xff0c;生成 SSH Key&#xff1a; ssh-keygen -t r…

使用chroma和LlamaIndex做RAG增強

RAG 原理&#xff1a;通過 “檢索&#xff08;從知識庫獲取相關信息&#xff09;→ 增強&#xff08;將信息作為上下文輸入模型&#xff09;→ 生成&#xff08;模型基于上下文回答&#xff09;” 三步&#xff0c;解決大模型知識時效性、領域局限性問題。 接下來將完成這么一個…

2025 最應避免的攝影陷阱以及解決方案

你有沒有想過&#xff0c;當你拍完了一個完美的場景后&#xff0c;卻發現畫面模糊、光線不足&#xff0c;或者更糟的是&#xff0c;存儲卡中的文件丟失了&#xff1f;這些問題可能會發生在任何人身上&#xff0c;無論是業余愛好者、專業人士還是最好的攝影師。當珍貴的記憶變成…

python類--python011

面向對象編程中的類的概念、屬性使用、繼承和類的改造問題等。7.1 初識類在軟件編程中&#xff0c;面向過程和面向對象是兩種主要的編程方法。面向過程的編程強調通過函數來實現特定的功能&#xff0c;具有靈活性&#xff0c;但在復雜系統中往往導致代碼重復&#xff0c;維護困…

Python函數篇:從零到精通

一、函數1.1 為什么有函數我們對于一個項目時&#xff0c;會有上千甚至上萬條代碼&#xff0c;當我們要使用到某個函數時&#xff0c;例如我需要計算一個求和代碼&#xff0c;獲得求和的值來服務我們的項目&#xff0c;那我們可能會這樣#計算1&#xff5e;100的和 theSun 0 fo…

QT項目之記事本

本文用QT實現記事本功能。一、成品展示1.界面主要元素&#xff1a;1.標題為MyNoteBook&#xff1b;2.相應圖標為&#xff1a;打開文件&#xff0c;保存&#xff0c;退出&#xff1b;3.右下角標注光標所在行列&#xff0c;默認編碼方式為UTF-8&#xff1b;4.鼠標所在圖標位置時會…

【軟件測試】性能測試 —— 工具篇 JMeter 介紹與使用

&#x1f970;&#x1f970;&#x1f970;來都來了&#xff0c;不妨點個關注叭&#xff01; &#x1f449;博客主頁&#xff1a;歡迎各位大佬!&#x1f448; 文章目錄1. JMeter 的介紹2. JMeter 安裝、配置、搭建2.1 前置條件 —— Java環境搭建2.2 JMeter 下載2.3 JMeter 安裝…

二十二、Mybatis-快速入門程序

入門程序大概步驟敘述&#xff1a; 步驟一&#xff1a;創建springboot工程并且數據庫提前創建表步驟二&#xff1a;創建springboot工程對Mybatis相關依賴注意打勾步驟三&#xff1a;編寫查找方法步驟四&#xff1a;編寫測試方法項目目錄結構與數據庫以及代碼&#xff1a; 項目目…

Blender模擬結構光3D Scanner(一)外參數匹配

如何使用Blender模擬FPP(Fringe Projection Profilometry) 原理的結構光3D傳感器&#xff1f;主要包含的工作有&#xff1a;1&#xff09;相機、投影儀定位與內外參數匹配&#xff1b;2&#xff09;投影儀投射指定Pattern圖像&#xff1b;3&#xff09;被測物體材質屬性配置等&…

LangChain是如何實現RAG多輪問答的

目錄引言一、LangChain實現RAG多輪問答核心機制1. 對話歷史管理&#xff08;Memory&#xff09;2. 問題重寫&#xff08;Query Rewriting&#xff09;3. 檢索增強生成&#xff08;RAG Core&#xff09;4. 鏈式工作流&#xff08;Chain&#xff09;二、關鍵設計特點三、完整示例…

DAY 44 預訓練模型

知識點回顧&#xff1a; 預訓練的概念常見的分類預訓練模型圖像預訓練模型的發展史預訓練的策略預訓練代碼實戰&#xff1a;resnet18 一、預訓練的概念 我們之前在訓練中發現&#xff0c;準確率最開始隨著epoch的增加而增加。隨著循環的更新&#xff0c;參數在不斷發生更新。 所…

Java Stream API 中常用方法復習及項目實戰示例

在最近的練手項目中&#xff0c;對于stream流的操作愈加頻繁&#xff0c;我也越來越感覺stream流在處理數據是的干凈利落&#xff0c;因此寫博客用來記錄最近常用的方法以便于未來的復習。map() 方法map()是一個中間操作&#xff08;intermediate operation&#xff09;&#x…

從零開始手搓一個GPT大語言模型:從理論到實踐的完整指南(一)

現在人工智能飛速發展時代&#xff0c;LLM絕對可以算是人工智能領域得一顆明珠&#xff0c;也是現在許多AI項目落地得必不可少得一個模塊&#xff0c;可以說&#xff0c;不管你之前得研究領域是AI得哪個方向&#xff0c;現在都需要會一些LLM基礎&#xff0c;在這個系列&#xf…

Redis ubuntu下載Redis的C++客戶端

1. 安裝 redis-plus-plus C 操作 Redis 的庫有很多&#xff0c;這里選擇使用 redis-plus-plus&#xff0c;這個庫的功能強大&#xff0c;使用簡單。 Github 地址&#xff1a;GitHub - sewenew/redis-plus-plus: Redis client written in C 訪問不了Github 地址的可以使用Ste…

nm命令和nm -D命令參數

出現這種差異的原因在于&#xff1a;動態庫中的符號分為兩種類型&#xff1a; 常規符號表&#xff08;regular symbol table&#xff09;&#xff1a;通常用于靜態鏈接和調試&#xff0c;默認不包含在動態庫中&#xff08;除非顯式保留&#xff09;。動態符號表&#xff08;dyn…

Windows下cuda的安裝和配置

今天開始做一個cuda教程。由于本人主要在windows下使用visual studio進行開發&#xff0c;因此這里講一下windows下的cuda開發環境。 下載cuda_toolkit 從網站https://developer.nvidia.com/cuda-toolkit中下載&#xff0c;先選擇Download Now,然后跳轉到如下頁面&#xff1a…

【代碼隨想錄day 19】 力扣 450.刪除二叉搜索樹中的節點

視頻講解&#xff1a;https://www.bilibili.com/video/BV1tP41177us/?share_sourcecopy_web&vd_sourcea935eaede74a204ec74fd041b917810c 文檔講解&#xff1a;https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%A…

智慧養老丨實用科普+避坑指南:科技如何讓晚年生活更安全舒適?

隨著老齡化社會的到來&#xff0c;智慧養老產品逐漸成為改善老年人生活質量的重要工具。從智能手表到便攜洗浴機&#xff0c;科技正為老年人的健康、安全與生活便利提供創新解決方案。我們這次主要介紹四類典型智慧養老產品&#xff0c;結合真實體驗給出選購建議&#xff0c;并…

系統垃圾清理批處理腳本 (BAT)

系統垃圾清理批處理腳本 (BAT) 以下是一個Windows系統垃圾清理的批處理腳本&#xff0c;它可以清理常見的系統臨時文件、緩存和日志等&#xff1a; echo off title 系統垃圾清理工具 color 0a echo. echo 正在清理系統垃圾文件&#xff0c;請稍候... echo.:: 清理臨時文件 echo…