《Programming from the Ground Up》阅读笔记:p103-p116

2024-08-25 00:52

本文主要是介绍《Programming from the Ground Up》阅读笔记:p103-p116,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Programming from the Ground Up》学习第7天,p103-p116总结,总计14页。

一、技术总结

1.读写文件

(1)linux.s

linux.s:

#file name: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

(2)record-def.s

record-def.s:

#file name: record-def.s.equ RECORD_FIRSTNAME, 0
.equ RECORD_LASTNAME, 40
.equ RECORD_ADDRESS, 80
.equ RECORD_AGE, 320
.equ RECORD_SIZE, 328

(3)read-record.s & read-record.s

read-record.s:

#file name: read-record.s.include "record-def.s"
.include "linux.s"# stack local variables
.equ ST_READ_BUFFER, 16
.equ ST_FILEDES, 24.section .text.global read_record
.type read_record, @function
read_record:push %rbpmov %rsp, %rbppush %rbxmov ST_FILEDES(%rbp), %rdimov ST_READ_BUFFER(%rbp), %rsimov $RECORD_SIZE, %rdxmov $SYS_READ, %raxsyscallpop %rbxmov %rbp, %rsppop %rbpret

read-records.s:

#file name: read-records.s.include "linux.s"
.include "record-def.s".section .datafilename:.ascii "ch6/test.dat\0"newline:.ascii "\n\0".section .bss.lcomm RECORD_BUFFER, RECORD_SIZE.section .text.global _start_start:.equ INPUT_DESCRIPTOR, -8.equ OUTPUT_DESCRIPTOR, -16mov %rsp, %rbp# open ch6/test.datmov $SYS_OPEN, %raxmov $filename, %rdimov $0, %rsimov $0666, %rdxsyscallpush %rax       # push input file descriptor onto stackpush $STDOUT    # push output file descriptor onto stackrecord_read_loop:# invoke read_record functionpush INPUT_DESCRIPTOR(%rbp)push $RECORD_BUFFERcall read_recordadd $16, %rsp       # pop function args off of stackcmp $RECORD_SIZE, %raxjne finished_readingpush $RECORD_FIRSTNAME + RECORD_BUFFERcall count_charsadd $8, %rsp        mov %rax, %rdx                      # count of chars to printmov $RECORD_BUFFER, %rsimov OUTPUT_DESCRIPTOR(%rbp), %rdimov $SYS_WRITE, %raxsyscallmov $1, %rdx                      # count of chars to printmov $newline, %rsimov OUTPUT_DESCRIPTOR(%rbp), %rdimov $SYS_WRITE, %raxsyscalljmp record_read_loopfinished_reading:mov $SYS_EXIT, %raxmov $0, %rdisyscall

(4)write-record.s & write-records.s

write-record.s:

#filename:write-record.s.include "linux.s"
.include "record-def.s"#PURPOSE:   This function writes a record to
#           the given file descriptor
#
#INPUT:     The file descriptor(%rdi) and a buffer(%rsi)
#
#OUTPUT:    This function produces a status code
#
.section .text.globl write_record.type write_record, @functionwrite_record:#将 system call number 1存入rax寄存器,执行syscall的时候表示执行write操作movq  $SYS_WRITE, %rax#执行syscall时,RECORD_SIZE(值为324)用作write(unsigned int fd,const char *buf,size_t count)的第三个参数。movq  $RECORD_SIZE, %rdx                                 syscallret

write-records.s:

#file name: write-record.s
.include "linux.s"
.include "record-def.s" .section .data
record1:.ascii "Fredrick\0".rept 31.byte 0.endr.ascii "Bartlett\0".rept 31.byte 0.endr.ascii "4242 S Prairie\nTulsa, OK 55555\0".rept 209.byte 0.endr.long 45record2:.ascii "Marilyn\0".rept 32.byte 0.endr.ascii "Taylor\0".rept 33.byte 0.endr.ascii "2224 S Johannan St\nChicago, IL 12345\0".rept 203.byte 0.endr.long 29record3:.ascii "Derrick\0".rept 32.byte 0.endr.ascii "McIntire\0".rept 31.byte 0.endr.ascii "500 W Oakland\nSan Diego, CA 54321\0".rept 206.byte 0.endr.long 36file_name:.ascii "test.dat\0".section .text
.globl _start
_start:subq  $8, %rsp                 # Allocate space for the file descriptor on the stackmovq  $SYS_OPEN, %rax          # Open the filemovq  $file_name, %rdi         # Filenamemovq  $0101, %rsi              # Flags: O_WRONLY | O_CREATmovq  $0666, %rdx              # Permissions: 0666syscallmovq  %rax, (%rsp)             # Store the file descriptor on the stack# Write the first recordmovq (%rsp), %rdi              # Load the file descriptormovq $record1, %rsi            # Load the address of the first recordcall  write_record# Write the second recordmovq (%rsp), %rdi              # Load the file descriptormovq $record2, %rsi            # Load the address of the second recordcall  write_record# Write the third recordmovq (%rsp), %rdi              # Load the file descriptormovq $record3, %rsi            # Load the address of the third recordcall  write_record# Close the file descriptormovq  $SYS_CLOSE, %raxmovq  (%rsp), %rdisyscall# Exit the programmovq $SYS_EXIT, %raxmovq  $0, %rdisyscall

二、英语总结

无。

三、其它

今日学习唯一的收获就是使用Chat-GPT解决代码问题。因为书上的代码比较老旧,导致write-records.s编译后运行不起来,一直提示:Segmentation Fault。因为对汇编编程不熟,但又想快速的解决问题,那么Chat-GPT是一个不错的工具,经过Chat-GPT的一番修改,代码已经能运行了,大大节省了分析错误的时间。

四、参考资料

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)

这篇关于《Programming from the Ground Up》阅读笔记:p103-p116的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104092

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个