《Programming from the Ground Up》阅读笔记:p117-p146

news2024/11/18 7:24:53

《Programming from the Ground Up》学习第8天,p117-p146总结,总计30页。

一、技术总结

1.共享函数用法示例

(1)不使用共享函数

linux.s:

# filename:linux.s

# system call numbers(按数字大小排列,方便查看)
.equ SYS_READ, 0
.equ SYS_WRITE, 1
.equ SYS_OPEN, 2
.equ SYS_CLOSE, 3
.equ SYS_EXIT, 60

# standard file descriptors
.equ STDIN, 0
.equ STDOUT, 1
.equ STDERR, 2

# common status codes
.equ END_OF_FILE, 0

helloworld-nolib.s:

#filename: helloworld-nolib.s
# 编译命令:
 # as helloworld-nolib.s -o helloworld-nolib.o
 # ld helloworld-nolib.o -o helloworld-lib
.include "linux.s"

.section .data
helloworld:
	.ascii "hello world\n"
helloworld_end:
	#helloworld_end - helloworld的意思:
	.equ helloworld_len, helloworld_end - helloworld
.section .text
	.global _start

_start:
	#write涉及到SYS_WRITE,
	movq  $SYS_WRITE, %rax
    movq  $STDOUT, %rdi
    movq  $helloworld, %rsi
    movq  $helloworld_len, %rdx
    syscall
    
	# 退出函数: exit()
    movq  $SYS_EXIT, %rax
    movq  $0, %rdi
    syscall

执行helloworld-nolib结果:

# ./helloworld-nolib
hello world

(2)使用共享函数:print、exit

helloworld-lib.s:

# filename: helloworld-lib.s
# 编译命令:
 # as helloworld-lib.s -o helloworld-lib.o
 # ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o helloworld-lib helloworld-lib.o -lc
.section .data
helloworld:
    .ascii "hello world\n\0"

.section .text
    .globl _start
    
_start:
    movq $helloworld, %rdi
    call printf # C语言中的printf
    movq $0, %rdi
    call  exit # C语言中的exit

执行helloworld-lib结果:

# ./helloworld-nolib
hello world

2.问题:-bash: ./helloworld-lib: No such file or directory

  • 问题描述

    root@LAPTOP-5PGRQ2IO:/mnt/d/Projects/AssemblyProjects# ld -dynamic-linker /lib/ld-linux.so.2 -o helloworld-lib helloworld-lib.o -lc
    root@LAPTOP-5PGRQ2IO:/mnt/d/Projects/AssemblyProjects# ll
    total 96
    drwxrwxrwx 1 root root  4096 Sep 28 15:48 ./
    drwxrwxrwx 1 root root  4096 Jun 24 07:23 ../
    -rwxrwxrwx 1 root root   147 Aug 25 16:18 add-year.s*
    -rwxrwxrwx 1 root root  1075 Aug 31 18:55 count-chars.s*
    -rwxrwxrwx 1 root root   112 Aug 25 16:26 error-exit.s*
    -rwxrwxrwx 1 root root   863 Jul  1 23:39 exit.s*
    -rwxrwxrwx 1 root root 14048 Sep 28 15:48 helloworld-lib*
    -rwxrwxrwx 1 root root   920 Sep 28 15:47 helloworld-lib.o*
    -rwxrwxrwx 1 root root   224 Sep  2 08:43 helloworld-lib.s*
    -rwxrwxrwx 1 root root  9224 Sep 28 15:44 helloworld-nolib*
    -rwxrwxrwx 1 root root  1208 Sep  2 08:39 helloworld-nolib.o*
    -rwxrwxrwx 1 root root   510 Sep  2 08:39 helloworld-nolib.s*
    -rwxrwxrwx 1 root root   264 Aug 24 17:52 linux.s*
    -rwxrwxrwx 1 root root   774 Jul  3 06:25 maximum.s*
    drwxrwxrwx 1 root root  4096 Aug 25 16:20 pgu_64-master/
    -rwxrwxrwx 1 root root  2318 Jul 16 07:52 power.s*
    -rwxrwxrwx 1 root root   453 Aug 24 18:14 read-record.s*
    -rwxrwxrwx 1 root root  1333 Aug 24 18:15 read-records.s*
    -rwxrwxrwx 1 root root   117 Aug 23 08:23 record-def.s*
    -rwxrwxrwx 1 root root   984 Aug 24 17:58 test.dat*
    -rwxrwxrwx 1 root root  5612 Jul 27 11:47 toupper.s*
    -rwxrwxrwx 1 root root  1128 Aug 24 17:57 write-record.o*
    -rwxrwxrwx 1 root root   686 Aug 24 17:54 write-record.s*
    -rwxrwxrwx 1 root root 10816 Aug 24 17:58 write-records*
    -rwxrwxrwx 1 root root  2632 Aug 24 17:57 write-records.o*
    -rwxrwxrwx 1 root root  2081 Aug 24 17:57 write-records.s*
    root@LAPTOP-5PGRQ2IO:/mnt/d/Projects/AssemblyProjects# ./helloworld-lib
    -bash: ./helloworld-lib: No such file or directory
    

    在执行 ./helloworld-lib 命令时提示 -bash: ./helloworld-lib: No such file or directory,但 helloworld-lib 实际上是存在的。

  • 原因分析

    /lib/ld-linux.so.2用于32位可执行文件,本人的系统是64位的WSL Ubuntu22.04,查看该文件是否存在:

    # ls /lib/ld-linux.so.2
    ls: cannot access '/lib/ld-linux.so.2': No such file or directory
    

    执行 ls /lib/ld-linux.so.2 命令可以发现系统中没有 /lib/ld-linux.so.2 这个文件,所以虽然执行ld命令时没有报错,但是执行 ./helloworld-lib 命令时报错了:-bash: ./helloworld-lib: No such file or directory。

  • 解决方法

    因为电脑是 64 位的,所以使用 /lib64/ld-linux-x86-64.so.2 而不是 /lib/ld-linux.so.2:

    ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o helloworld-lib helloworld-lib.o -lc
    

二、英语总结

1.majorly

p129, Code that is copied often has to be majorly modified to fit the surrounding code.在这里,majorly既可以指“量”也可以指“质”上的巨大修改。

三、其它

上一次阅读还是2024/8/24,期间因为工作上一些不愉快的事一直没有抽离出来,今天算是慢慢调整过来了,继续干。

四、参考资料

1. 编程

(1)Jonathan Bartlett,《Programming From The Ground Up》:https://book.douban.com/subject/1787855/

2. 英语

(1)Etymology Dictionary:https://www.etymonline.com

(2) Cambridge Dictionary:https://dictionary.cambridge.org

在这里插入图片描述

欢迎搜索及关注:编程人(a_codists)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FreeRTOS学习笔记一——FreeRTOS介绍

RTOS学习笔记,主要参考正点原子教程 目录 FreeRTOS特点任务调度方式抢占式调度时间片调度 任务状态状态转换任务列表 FreeRTOS特点 实现多个任务功能划分延时函数实现任务调度高优先级抢占低优先级每个任务都有自己的栈空间 注意: 中断可以打断任意任务…

Spring依赖注入推荐使用构造函数注入而非@Autowired

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl在Spring框架中,依赖注入(Dependency Injection, DI)是实现组件之间松耦合的关键技术。Spring支持多种依赖注入方式,其中构造函数注入和基于@Autowired注解的注入是两种常见的方法。然而,Spri…

活体检测标签之2.4G有源RFID--SI24R2F+

首先从客户对食品安全和可追溯性的关注切入,引出活体标签这个解决方案。接着分别阐述活体标签在动物养殖和植物产品方面的应用,强调其像 “身份证” 一样记录重要信息,让客户能够了解食品的来源和成长历程,从而放心食用。最后呼吁…

手机USB连接不显示内部设备,设备管理器显示“MTP”感叹号,解决方案

进入小米驱动下载界面,等小米驱动下载完成后,解压此驱动文件压缩包。 5、小米USB驱动安装方法:右击“计算机”,从弹出的右键菜单中选择“管理”项进入。 6、在打开的“计算机管理”界面中,展开“设备管理器”项&…

VS开发 - 静态编译和动态编译的基础实践与混用

目录 1. 基础概念 2. 直观感受一下静态编译和动态编译的体积与依赖项目 3. VS运行时库包含哪些主要文件(从VS2015起) 4. 动态库和静态库混用的情况 5. 感谢清单 1. 基础概念 所谓的运行时库(Runtime Library)就是WINDOWS系统…

【易上手快捷开发新框架技术】nicegui标签组件lable用法庖丁解牛深度解读和示例源代码IDE运行和调试通过截图为证

传奇开心果微博文系列 序言一、标签组件lable最基本用法示例1.在网页上显示出 Hello World 的标签示例2. 使用 style 参数改变标签样式示例 二、标签组件lable更多用法示例1. 添加按钮动态修改标签文字2. 点击按钮动态改变标签内容、颜色、大小和粗细示例代码3. 添加开关组件动…

RFID系统如何革新资产信息数字化管理

在现代企业中,资产管理的有效性直接影响整体运营效率和成本控制。为了应对传统资产管理中存在的诸多挑战,越来越多的公司开始采用RFID系统,以实现资产信息的数字化管理,从而提高资产利用率和管理透明度。 RFID系统的主要优势 高…

【USB】USB1.0、USB1.1、USB2.0、USB3.0、USB4.0介绍及最大速率说明

USB 1.0 and USB 1.1 1995 年,成立了 USB-IF,该组织于次年宣布推出 USB 1.0。USB 1.0 规定的数据速率为 1.5 Mbit/s(低带宽或低速),最大输出电流为 5V/500mA。但不幸的是,这个 USB 版本也很少被制造商采用。…

C++ string的基本运用详细解剖

string的基本操作 一.与C语言中字符串的区别二.标准库中的string三.string中常用接口的介绍1.string中常用的构造函数2.string类对象的容量操作函数3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类的非成员函数6.string中的其他一些操作 一.与C语言中字符串…

网页WebRTC电话和软电话哪个好用?

关于WebRTC电话与软件电话哪个更好用,这实际上取决于多个因素,并没有一个绝对的答案。不过,我可以根据WebRTC技术的一些特点,以及与传统软件电话相比的优劣势,为你提供一个清晰的对比。 首先,让我们了解一下…

python画图|放大和缩小图像

在较多的画图场景中,需要对图像进行局部放大,掌握相关方法非常有用,因此我们很有必要一起学习 【1】官网教程 首先是进入官网教程,找到学习资料: https://matplotlib.org/stable/gallery/subplots_axes_and_figures…

uniapp在线打包的ios后调用摄像头失败的解决方法

uniapp在线打包的ios后调用摄像头失败的解决方法 解决方法: 由于未选中打包模块的配置 当你在测试时发现能够正常的开启摄像头,但是当你对其进行在线打包后,发现当你点击启用摄像头时,没有反应,或者是打开是黑屏状态…

STM32F103C8----3-1 LED闪烁(跟着江科大学STM32)

一,电路图 接线图 面包板的的使用请参考:《面包板的使用_面包板的详细使用方法-CSDN博客》 二,目的/效果 2.1 推婉输出 外部供电(熄的时间长) 2.2 推婉输出 内部供电(亮的时间长) 三,创建Keil项目 详…

无人机之集群控制及应用

一、无人机集群控制 无人机集群控制是指通过先进的通信、导航和控制算法,实现多架无人机之间的协同、协调和高效的任务执行。其关键技术包括: 通信技术:实现无人机之间的实时数据传输和共享,确保集群控制的准确性和稳定性。 路径…

RabbitMQ 高级特性——TTL

文章目录 前言TTL设置消息的 TTL设置队列的 TTL 前言 对于前面讲到的重试机制中,当确认策略为 MANUAL 手动确认的时候,如果消费者出现了程序逻辑错误,那么消息就无法被争取处理,那么就会执行 basicNack 方法,如果我们…

黑马头条day7-app端文章搜索

今天的内容也只是跑了一下 对于具体的实现掌握的很差 仔细看 es 在微服务学的es使用基本忘光了 这里用起来一点都熟悉 重学!!! kafka异步 文章自动构建索引的时候用到了‘’ mongoDB 用来存储用户的搜索记录 遗忘(拦截器 j…

【有啥问啥】In-Context Learning(上下文学习):深入解析与应用实践

In-Context Learning(上下文学习):深入解析与应用实践 引言 在人工智能与机器学习的浪潮中,In-Context Learning(上下文学习)作为一种新兴的学习范式,正逐渐崭露头角。与传统的机器学习模型不…

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)征稿

第四届机器人、自动化与智能控制国际会议(ICRAIC 2024)由湖南第一师范学院主办,南京师范大学、山东女子学院、爱迩思出版社(ELSP)协办。 大会将专注于机器人、数字化、自动化、人工智能等技术的开发和融合&#xff0c…

Go实现RabbitMQ 死信队列、优化

死信队列是什么? 如何配置死信队列? go实现死信队列 go使用发布订阅模式改造批量发送消息 【教学内容】 1. 死信队列是什么? 注意:业务队列与死信交换机的绑定是在构建业务队列时,通过参数(x-dead-le…

计算机网络基础--认识协议

目录 前言 一、IP地址与端口 二、网络协议 1.网络体系结构框架 2.网络字节序 前言 提示:这里可以添加本文要记录的大概内容: 计算机网络涉及非常广泛,这篇文章主要对计算机网络有个认识 提示:以下是本篇文章正文内容&#x…