CMake笔记——一

news/2025/1/24 14:29:48/文章来源:https://www.cnblogs.com/gwzz/p/18689479

# 1 cmake_policy

# 2 set的作用域

# 3 在命令行中设置为ON,还可以在cmake脚本中设置吗?如何设置?

# 4 CMAKE_FIND_ROOT_PATH 有什么作用?

# 5 命令的大小写

# 6 ccache

1 cmake_policy

# for CMake 2.6 corrected behaviour (see "cmake --help-policy CMP0003")
IF(COMMAND cmake_policy AND ${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND cmake_policy AND ${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4)

在所提供的CMake代码片段中,目的是为了确保在使用CMake版本2.6及以上(但低于3.0,因为检查的是主版本为2且次版本大于4)时,能够正确设置CMake策略CMP0003的行为。这个策略通常与CMake中某些默认行为的改变有关,具体到这个策略CMP0003,它通常涉及到对旧有行为的修正或更新。

代码解释如下:

IF(COMMAND cmake_policy AND ${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4):这一行检查两个条件:COMMAND cmake_policy:确认cmake_policy命令是否可用。这个命令用于设置CMake策略的行为。${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4:检查CMake的主版本是否为2且次版本是否大于4(即CMake版本在2.5到2.99之间,但不包括3.0及以上版本)。
CMAKE_POLICY(SET CMP0003 NEW):如果上述条件满足,这一行将策略CMP0003设置为NEW,即采用CMake推荐的新行为。
ENDIF(COMMAND cmake_policy AND ${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} GREATER 4):结束IF语句的条件检查。

总结:这段代码的目的是在CMake版本为2.6到2.99之间时,确保CMP0003策略被设置为使用新的行为。这样做可以确保项目在这些版本的CMake下能够正确构建,同时避免因为CMake默认行为改变而导致的潜在问题。如果您的项目依赖于特定的CMake行为,并且这些行为在后续版本中有所改变,使用cmake_policy来显式设置策略行为是一个很好的做法。

2 set的作用域

在 CMake 中,set 命令用于定义变量并给它们赋值。变量的作用域取决于它们被设置的位置和方式。要辨别 set 命令所设置变量的作用域,你需要考虑以下几个方面:

  • 目录作用域:

      当你在 CMakeLists.txt 文件中使用 set 命令时,所设置的变量默认具有目录作用域。这意味着该变量在当前目录及其子目录中可用,但在父目录中不可用。如果你想要在多个目录中共享变量,可以考虑使用 PARENT_SCOPE 关键字或者将变量设置为 CACHE 变量。
    
  • PARENT_SCOPE 关键字:

      使用 PARENT_SCOPE 关键字可以将变量设置到包含当前目录的父目录的作用域中。这通常用于函数或宏中,以便将结果传递回调用者。
    
  • CACHE 变量:

      通过将变量设置为 CACHE 变量,你可以使其在整个 CMake 配置过程中保持可用,甚至跨多个 CMake 运行。这通常用于配置选项或需要在多次构建之间保持不变的变量。要设置 CACHE 变量,你需要在 set 命令中指定 CACHE 关键字以及变量的类型和帮助字符串。
    
  • 函数和宏的作用域:

      在 CMake 函数或宏内部设置的变量默认只在该函数或宏的作用域内有效。一旦函数或宏执行完毕,这些变量就会被销毁。要从函数或宏中返回变量到调用者,你可以使用 PARENT_SCOPE 关键字。
    
  • 全局作用域:

      实际上,CMake 中没有真正的“全局作用域”概念。但是,通过将变量设置为 CACHE 变量,你可以模拟出全局作用域的效果,因为 CACHE 变量在整个 CMake 配置过程中都是可见的。
    
  • 检查变量的作用域:

      要检查一个变量是否在某个作用域中可用,你可以尝试在该作用域中打印出变量的值。如果变量不存在,CMake 通常会给出错误或警告信息。你也可以使用 if(DEFINED <variable>) 来检查变量是否已被定义。
    

总结来说,要辨别 set 命令所设置变量的作用域,你需要考虑变量被设置的位置(CMakeLists.txt 文件、函数、宏等)、是否使用了 PARENT_SCOPE 关键字、以及是否将变量设置为 CACHE 变量。通过理解这些概念,你可以更好地控制 CMake 中变量的作用域和可见性。

2.1 语法

set:

语法有多种形式,包括设置普通变量、缓存条目和环境变量。
设置普通变量:set(<variable> <value>... [PARENT_SCOPE])
设置缓存条目:set(<variable> <value>... CACHE <type> <docstring> [FORCE])
设置环境变量:set(ENV{<variable>} [<value>])

在 CMake 中,set 命令用于定义和设置变量的值。以下是 set 命令的一些常见用法示例:

2.1.1 设置普通变量

普通变量具有目录作用域,即在它们被定义的目录及其子目录中可用。

# 设置一个名为 MY_VAR 的变量,值为 "Hello"
set(MY_VAR "Hello")# 打印变量的值
message(STATUS "MY_VAR: ${MY_VAR}")

在这个例子中,MY_VAR 被设置为 "Hello",并且可以在同一个 CMakeLists.txt 文件或任何包含它的子目录中的后续命令中使用。

2.1.2. 设置多个值给变量

当给变量设置多个值时,这些值会被分号(;)连接起来形成一个字符串。

# 设置一个名为 LIST_VAR 的变量,包含多个值
set(LIST_VAR "value1" "value2" "value3")# 打印变量的值
message(STATUS "LIST_VAR: ${LIST_VAR}")

在这个例子中,LIST_VAR 被设置为 "value1;value2;value3"。

2.1.3. 使用 PARENT_SCOPE 关键字

在函数或宏内部,可以使用 PARENT_SCOPE 关键字将变量设置到父作用域中。

function(my_function)# 设置一个名为 PARENT_VAR 的变量,并将其值传递到父作用域set(PARENT_VAR "From Function" PARENT_SCOPE)
endfunction()# 调用函数
my_function()# 打印从函数中传递回来的变量的值
message(STATUS "PARENT_VAR: ${PARENT_VAR}")

在这个例子中,PARENT_VAR 在函数 my_function 内部被设置,并且其值被传递回父作用域,因此可以在函数外部打印出来。

注意到这个函数并没有参数,关键function的小括号内放的是函数名称,通过PARENT_SCOPE透传变量PARENT_VAR

2.1.4. 设置 CACHE 变量

CACHE 变量在整个 CMake 配置过程中都是可见的,甚至跨多个 CMake 运行。

# 设置一个名为 CACHE_VAR 的 CACHE 变量,类型为 STRING,并带有描述信息
set(CACHE_VAR "Cache Value" CACHE STRING "This is a cache variable")# 打印变量的值
message(STATUS "CACHE_VAR: ${CACHE_VAR}")

在这个例子中,CACHE_VAR 被设置为一个 CACHE 变量,其类型为 STRING,并且带有描述信息。这个变量可以在整个 CMake 配置过程中被访问和修改。

2.1.5. 追加值到变量

虽然 set 命令本身不直接支持追加操作,但可以通过先获取变量的当前值,然后再将新值追加到其后面来实现

# 设置一个初始变量
set(APPEND_VAR "Initial")# 追加新值到变量
set(APPEND_VAR "${APPEND_VAR};Appended")# 打印变量的值
message(STATUS "APPEND_VAR: ${APPEND_VAR}")

在这个例子中,APPEND_VAR 最初被设置为 "Initial",然后新值 "Appended" 被追加到其后面,形成 "Initial;Appended"。

请注意,对于列表类型的变量,CMake 提供了更专门的 list 命令来进行追加、移除和其他操作,这通常比手动拼接字符串更安全和方便。例如,使用 list(APPEND <list> <element> [...]) 命令来追加元素到列表中。

2.2 可选性设置变量

如何通过命令行设置set的变量,若命令行不设置,就用默认值?

在 CMake 中,你可以通过命令行传递-D选项来设置变量的值。如果你想在命令行上没有指定某个变量时使用默认值,你可以在 CMakeLists.txt 文件中使用 if 语句结合 not DEFINED 来检查变量是否已被设置,如果没有,则为其赋予一个默认值。

以下是一个示例,展示了如何在 CMakeLists.txt 中实现这一点:

# 检查 OROCOS_TARGET 是否已被设置
if(NOT DEFINED OROCOS_TARGET)# 如果没有设置,则使用默认值set(OROCOS_TARGET "gnulinux")  # 这里 "gnulinux" 是默认值,你可以根据需要更改它
endif()# 打印 OROCOS_TARGET 的值,以便验证
message(STATUS "OROCOS_TARGET: ${OROCOS_TARGET}")# 接下来的 CMake 代码可以使用 OROCOS_TARGET 变量
# ...

3 在命令行中设置为ON,还可以在cmake脚本中设置吗?如何设置?

CMAKE_EXPORT_COMPILE_COMMANDS 是一个 CMake 选项,用于控制是否生成包含编译命令信息的 compile_commands.json 文件。这个文件对于某些开发工具(如静态代码分析工具、IDE 等)来说非常有用,因为它们可以利用这些信息来提供更准确的代码补全、语法提示和代码分析功能。

3.1 在命令行中设置

你可以在 CMake 的命令行中通过 -D 选项来设置 CMAKE_EXPORT_COMPILE_COMMANDS 为 ON:

    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..

3.2 在 CMake 脚本中设置

同样地,你也可以在 CMakeLists.txt 或其他 CMake 脚本文件中设置这个变量。这通常是通过 set 命令来实现的:

    # 在 CMakeLists.txt 中设置 CMAKE_EXPORT_COMPILE_COMMANDS 为 ONset(CMAKE_EXPORT_COMPILE_COMMANDS ON)

将上述代码添加到你的 CMakeLists.txt 文件中,CMake 在配置项目时就会自动生成 compile_commands.json 文件。

3.3 注意事项

无论你是在命令行中设置还是在 CMake 脚本中设置,CMAKE_EXPORT_COMPILE_COMMANDS 的作用都是相同的,即控制是否生成 compile_commands.json 文件。

如果你同时在命令行和 CMake 脚本中设置了该变量,命令行中的设置会覆盖 CMake 脚本中的设置。

compile_commands.json 文件通常生成在构建目录中,与 CMake 生成的其他构建文件(如 Makefile 或项目文件)一起。

综上所述,CMAKE_EXPORT_COMPILE_COMMANDS 既可以在命令行中通过 -D 选项设置,也可以在 CMake 脚本中使用 set 命令设置。选择哪种方式取决于你的具体需求和项目配置流程。

4 CMAKE_FIND_ROOT_PATH 有什么作用?

4.1 概念

CMAKE_FIND_ROOT_PATH 在 CMake 中具有特定的作用,主要用于指定在搜索文件系统项(如库文件、头文件等)时应优先考虑的一组根路径。以下是关于 CMAKE_FIND_ROOT_PATH 的详细解释:
作用

CMAKE_FIND_ROOT_PATH 是一个由分号分隔的根路径列表,CMake 在执行 find_package()、find_library()、find_path()、find_file() 和 find_program() 等命令时,会首先在这些指定的根路径下进行搜索。这个功能在交叉编译时特别有用,因为它允许开发者指定目标环境的根目录,从而确保 CMake 在正确的位置查找所需的文件和库。
使用场景

  • 交叉编译:在交叉编译环境中,宿主机和目标机的文件系统结构可能完全不同。通过设置 CMAKE_FIND_ROOT_PATH,开发者可以确保 CMake 在目标环境的根目录下查找所需的文件和库,而不是在宿主机的文件系统中搜索。
  • 多版本管理:在某些情况下,系统上可能安装了多个版本的库或工具链。通过设置 CMAKE_FIND_ROOT_PATH,开发者可以指定 CMake 使用特定版本的库或工具链,从而避免版本冲突。
  • 自定义搜索路径:如果 CMake 默认搜索路径不满足需求,开发者可以通过设置 CMAKE_FIND_ROOT_PATH 来添加自定义搜索路径。

4.2 注意事项

  • CMAKE_FIND_ROOT_PATH 默认为空,即不指定任何额外的搜索路径。
  • 当使用 CMAKE_FIND_ROOT_PATH 时,CMake 会首先在这些指定的根路径下进行搜索。如果在这些路径中找不到所需的文件或库,CMake 才会回退到默认的搜索路径。
  • CMAKE_FIND_ROOT_PATH 可以与 CMAKE_FIND_ROOT_PATH_MODE_ 变量结合使用,以更精细地控制搜索行为。例如,CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 可以设置为 ONLY、NEVER 或 BOTH,以控制 find_library() 命令的搜索行为。

结论

CMAKE_FIND_ROOT_PATH 是 CMake 中一个非常重要的变量,它允许开发者在搜索文件系统项时指定一组优先考虑的根路径。这个功能在交叉编译、多版本管理和自定义搜索路径等场景中非常有用。通过合理使用 CMAKE_FIND_ROOT_PATH,开发者可以确保 CMake 在正确的位置查找所需的文件和库,从而提高构建过程的可靠性和效率。

4.3 其它

    # search for programs in the build host directoriesSET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)# for libraries and headers in the target directoriesSET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  • CMAKE_FIND_ROOT_PATH_MODE_PROGRAM

      SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    

这行代码告诉 CMake 在查找可执行程序时,不要使用 CMAKE_FIND_ROOT_PATH 中指定的路径。换句话说,CMake 会在宿主机的文件系统中查找程序,而不是在 sysroot 中。这对于交叉编译环境来说通常是正确的,因为您通常希望在宿主机上运行构建工具(如编译器、链接器等)。

  • 设置 CMAKE_FIND_ROOT_PATH_MODE_LIBRARY 和 CMAKE_FIND_ROOT_PATH_MODE_INCLUDE

      SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    

这两行代码指示 CMake 在查找库文件和头文件时,只使用 CMAKE_FIND_ROOT_PATH 中指定的路径。这意味着 CMake 不会在宿主机的文件系统中查找这些文件,而只会在 sysroot 中查找。这对于确保您链接到正确版本的库和包含正确的头文件来说是非常重要的。

  • 修正后的 CMake 语法:
    由于 SET 不是 CMake 的标准命令(至少不是以这种方式使用的),您应该使用 set 命令,并确保语法正确。以下是修正后的版本:

      set(CMAKE_FIND_ROOT_PATH "/usr/local/ti-sdk-am335x-evm/linux-devkit/sysroots/i686-arago-linux/usr/arm-linux-gnueabihf")set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    

5 命令的大小写

在 CMake 中,SET 和 set 实际上是相同的命令,它们不区分大小写。不过,为了保持一致性和遵循常见的编程习惯,通常建议使用小写形式的 set。

CMake 的命令是不区分大小写的,但出于可读性和可维护性的考虑,CMake 社区和文档通常推荐使用小写形式来编写命令和变量名。这有助于保持代码的一致性,并使其他开发者更容易阅读和理解您的 CMakeLists.txt 文件。

例如,以下两种写法在 CMake 中都是有效的,但推荐使用第二种小写形式:

    # 大写形式,虽然有效,但不推荐SET(MY_VARIABLE "some_value")# 小写形式,推荐使用set(MY_VARIABLE "some_value")

此外,值得注意的是,CMake 中的变量名是区分大小写的。 MY_VARIABLE 和 my_variable 会被视为两个不同的变量。

综上所述,虽然在 CMake 中 SET 和 set 是相同的命令,但为了保持代码的一致性和可读性,建议始终使用小写形式的 set 命令。

cmake的系统变量都是大写形式

6 ccache

在 CMake 中,USE_CCACHE 并不是一个内置的变量或命令。不过,ccache 是一个广泛使用的编译器缓存工具,它可以显著提高编译速度,特别是当您反复编译相同的代码时。要在 CMake 项目中使用 ccache,您通常需要通过设置编译器路径来间接实现。

以下是在 CMake 项目中配置 ccache 的一些步骤:

  • 安装 ccache:

    首先,确保您的系统上已经安装了 ccache。在大多数 Linux 发行版上,您可以使用包管理器来安装它,例如 apt-get install ccache(对于 Debian/Ubuntu)或 yum install ccache(对于 CentOS/RHEL)。

  • 设置编译器路径:

    在 CMake 中,您可以通过设置 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 变量来指定 C 和 C++ 编译器的路径。为了使用 ccache,您需要将这些变量设置为指向 ccache 的路径,并附上实际的编译器命令作为参数。

    例如,如果您的系统上默认的 C 编译器是 gcc,C++ 编译器是 g++,您可以这样设置:

      set(CMAKE_C_COMPILER "ccache gcc")set(CMAKE_CXX_COMPILER "ccache g++")
    

或者,如果您想更灵活地处理编译器路径,可以使用 CMAKE_C_COMPILER_TARGET 和 CMAKE_CXX_COMPILER_TARGET(对于交叉编译)或者检查环境变量来确定编译器的实际路径

在CMake中,SET 命令用于设置变量。在您提供的代码片段中,您正在设置两个关键的编译器变量:CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER。这两个变量分别指定了用于编译C语言和C++语言源代码的编译器。

通过将这些变量设置为 "ccache gcc" 和 "ccache g++",您实际上是在指定使用 ccache 作为编译器的前端。ccache 是一个编译器缓存工具,它可以缓存先前的编译结果,从而加速后续的编译过程。当您使用 ccache 时,它会检查缓存中是否已经有了一个与当前编译任务相匹配的先前结果。如果有,它就会重用那个结果,而不是重新编译源代码。如果没有,它就会调用实际的编译器(在这个例子中是 gcc 或 g++)来编译源代码,并将结果存储到缓存中。

这里是如何解释这些设置的:

SET(CMAKE_C_COMPILER "ccache gcc"):这条命令告诉CMake在编译C语言源代码时使用 ccache gcc 作为编译器。这意味着每次CMake需要编译C文件时,它都会调用 ccache,而 ccache 会根据需要调用 gcc。SET(CMAKE_CXX_COMPILER "ccache g++"):这条命令告诉CMake在编译C++语言源代码时使用 ccache g++ 作为编译器。与C语言的情况类似,每次CMake需要编译C++文件时,它都会通过 ccache 来调用 g++。

使用 ccache 可以显著提高大型项目的编译速度,特别是在那些频繁进行部分编译或增量编译的开发环境中。然而,需要注意的是,ccache 的效率取决于项目的特性和编译缓存的命中率。在某些情况下,特别是当项目非常大且编译缓存难以有效管理时,使用 ccache 可能会带来额外的复杂性或开销。因此,在决定是否使用 ccache 时,最好根据项目的具体情况进行评估。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874724.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot使用SSE流,打tar包发版后出现问题

SpringBoot使用SSE流,打tar包发版后出现问题 以下纯个人实践,如有问题,还望指正~ 出现的问题 出现原因:本地调试SSE推送数据没有问题,但是通过打包为tar包发版之后,出现了以下报错: 主要问题就是: java.lang.IllegalArgumentException: Async support must be enabled …

【每日一题】20250124

读书就是这样好,无论心不在焉,板着长脸,只要考试及格,就是一个及格的人。【每日一题】 1.(20分) \(\hspace{0.6cm}\)如图所示,质量 \(M=2 \; \mathrm{kg}\) 的滑块套在光滑的水平轨道上,质量 \(m=1 \; \mathrm{kg}\) 的小球通过长 \(L=0.5 \; \mathrm{m}\) 的轻质细杆与…

Golang sync.pool源码解析

sync.Pool 是 Go 中用于对象复用的工具,可减少频繁创建和销毁对象的开销,从而优化内存使用和降低 GC 压力。本文通过分析其用法、真实案例及源码结构,详细解读了 sync.Pool 的读写流程及其背后的高效设计思想,为性能优化提供了实用参考。Golang sync.pool源码解析 - sync.p…

从靶场到实战:双一流高校多个高危漏洞

本文结合其它用户案例分析讲解挖掘某双一流站点的过程,包含日志泄露漏洞深入利用失败,到不弱的弱口令字典进入后台,再到最后偶遇一个貌似只在靶场遇到过的高危漏洞。本文结合其它用户案例分析讲解挖掘某双一流站点的过程,包含日志泄露漏洞深入利用失败,到不弱的弱口令字典…

Nginx 架构和安装

1.1 Nginx 概述 1.1.1 Nginx 介绍 Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器 解决C10K问题(10K Connect…

Linux命令大全-快速查询手册

访问地址: 线上访问:https://git.io/linux 开源社区:https://github.com/jaywcjlove/linux-command 简要介绍: Linux 命令大全搜索工具,内容包含 Linux 命令手册、详解、学习、搜集,中文解释,支持背景切换。主要功能: 当前仓库搜集了 580 多个 Linux 命令,是一个非盈利…

IPTVnator - 最方便的开源 IPTV 播放器

IPTVnator 是一款视频播放器应用程序,提供对 IPTV 播放列表播放(m3u、m3u8)的支持。该应用程序允许用户使用远程 URL 或从本地文件系统上传文件来导入播放列表。此外,它还支持 XMLTV 格式的 EPG 信息,可以通过 URL 提供。该应用程序是一个使用 Electron(目前正在迁移到 T…

中电金信首次通过数据管理能力成熟度(DCMM)四级认证

日前,中国电子信息行业联合会发布《关于公布获得数据管理能力成熟度等级证书单位的通知(第十四批)》,中电金信正式通过数据管理能力成熟度(DCMM)等级认定——量化管理级(4级)。DCMM即数据管理能力成熟度评估模型(Data management Capability Maturity Model),是我国首…

执子之手与子偕老:镌刻在时光深处的爱情传奇

执子之手与子偕老:镌刻在时光深处的爱情传奇“死生契阔,与子成说。执子之手,与子偕老。” 这出自《诗经・邶风・击鼓》的千古名句,如同一首跨越千年的悠扬情歌,萦绕在人类情感的天际,描绘出爱情最纯粹、最美好的模样,承载着人们对永恒相伴、不离不弃的深深期许。它不仅仅…

二维数点问题

二维数点问题。P10814 【模板】离线二维数点 询问区间 \([l,r]\) 内,在值域为 \([0,x]\) 中数的个数。 想象这是个二维平面,我们要求的就是矩形内点的个数。通常用 cdq 做,将询问拆成两个点,将点按照x坐标排序,按照y坐标加入到树状数组中(为了满足第二条限制),这时就依次…

CS162 23Fall总结

CS 162 23Fall Lab 总结 PintOS是一个x86架构的教育用操作系统,它支持多线程,加载并运行用户程序,以及文件系统。骨架代码只提供了很简单的实现,本Lab需要丰富并增强这些模块的功能。本实验提供Bochs2和QEMU3模拟器模拟x86 CPU和相应外设来运行并调试PintOS.PintOS源码结构…

《汇编语言》阅读笔记

如题汇编语言 首先,我必须赞扬王爽老师,这是我见过写的最好的教科书了. 然后要注意,汇编语言这本书的前提是8086PC机十六位处理器.还要学x86和x64以及其他奇奇怪怪的架构的汇编 全称 AH&AL=AX(accumulator):累加寄存器 BH&BL=BX(base):基址寄存器 CH&CL=CX(co…