本篇记录了《汇编语言:基于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…