《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 %rbp
mov %rsp, %rbp push %rbx
mov ST_FILEDES(%rbp), %rdi
mov ST_READ_BUFFER(%rbp), %rsi
mov $RECORD_SIZE, %rdx
mov $SYS_READ, %rax
syscall
pop %rbx mov %rbp, %rsp
pop %rbp
ret

read-records.s:

#file name: read-records.s

.include "linux.s"
.include "record-def.s" .section .data filename:
.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, -16 mov %rsp, %rbp # open ch6/test.dat
mov $SYS_OPEN, %rax
mov $filename, %rdi
mov $0, %rsi
mov $0666, %rdx
syscall push %rax # push input file descriptor onto stack
push $STDOUT # push output file descriptor onto stack record_read_loop:
# invoke read_record function
push INPUT_DESCRIPTOR(%rbp)
push $RECORD_BUFFER
call read_record
add $16, %rsp # pop function args off of stack cmp $RECORD_SIZE, %rax
jne finished_reading push $RECORD_FIRSTNAME + RECORD_BUFFER
call count_chars
add $8, %rsp mov %rax, %rdx # count of chars to print
mov $RECORD_BUFFER, %rsi
mov OUTPUT_DESCRIPTOR(%rbp), %rdi
mov $SYS_WRITE, %rax
syscall mov $1, %rdx # count of chars to print
mov $newline, %rsi
mov OUTPUT_DESCRIPTOR(%rbp), %rdi
mov $SYS_WRITE, %rax
syscall jmp record_read_loop finished_reading:
mov $SYS_EXIT, %rax
mov $0, %rdi
syscall

(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, @function write_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
syscall ret

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 45 record2:
.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 29 record3:
.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 36 file_name:
.ascii "test.dat\0" .section .text
.globl _start
_start:
subq $8, %rsp # Allocate space for the file descriptor on the stack movq $SYS_OPEN, %rax # Open the file
movq $file_name, %rdi # Filename
movq $0101, %rsi # Flags: O_WRONLY | O_CREAT
movq $0666, %rdx # Permissions: 0666
syscall movq %rax, (%rsp) # Store the file descriptor on the stack # Write the first record
movq (%rsp), %rdi # Load the file descriptor
movq $record1, %rsi # Load the address of the first record
call write_record # Write the second record
movq (%rsp), %rdi # Load the file descriptor
movq $record2, %rsi # Load the address of the second record
call write_record # Write the third record
movq (%rsp), %rdi # Load the file descriptor
movq $record3, %rsi # Load the address of the third record
call write_record # Close the file descriptor
movq $SYS_CLOSE, %rax
movq (%rsp), %rdi
syscall # Exit the program
movq $SYS_EXIT, %rax
movq $0, %rdi
syscall

二、英语总结

无。

三、其它

今日学习唯一的收获就是使用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的更多相关文章

  1. Mongodb Manual阅读笔记:CH3 数据模型(Data Models)

    3数据模型(Data Models) Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mon ...

  2. faster rcnn源码阅读笔记1

    自己保存的源码阅读笔记哈 faster rcnn 的主要识别过程(粗略) (开始填坑了): 一张3通道,1600*1600图像输入中,经过特征提取网络,得到100*100*512的feature ma ...

  3. Tacotron2论文阅读笔记

    Tacotron2 NATURAL TTS SYNTHESIS BY CONDITIONING WAVENET ON MEL SPECTROGRAM PREDICTIONS论文阅读笔记 先推荐一篇比较 ...

  4. 阅读笔记 1 火球 UML大战需求分析

    伴随着七天国庆的结束,紧张的学习生活也开始了,首先声明,阅读笔记随着我不断地阅读进度会慢慢更新,而不是一次性的写完,所以会重复的编辑.对于我选的这本   <火球 UML大战需求分析>,首先 ...

  5. [阅读笔记]Software optimization resources

    http://www.agner.org/optimize/#manuals 阅读笔记Optimizing software in C++   7. The efficiency of differe ...

  6. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  7. <<UML大战需求分析>>阅读笔记(2)

    <<UML大战需求分析>>阅读笔记(2)> 此次读了uml大战需求分析的第三四章,我发现这本书讲的特别的好,由于这学期正在学习设计模式这本书,这本书就讲究对uml图的利用 ...

  8. uml大战需求分析阅读笔记01

    <<UML大战需求分析>>阅读笔记(1) 刚读了uml大战需求分析的第一二章,读了这些内容之后,令我深有感触.以前学习uml这门课的时候,并没有好好学,那时我认为这门课并没有什 ...

  9. Hadoop阅读笔记(七)——代理模式

    关于Hadoop已经小记了六篇,<Hadoop实战>也已经翻完7章.仔细想想,这么好的一个框架,不能只是流于应用层面,跑跑数据排序.单表链接等,想得其精髓,还需深入内部. 按照<Ha ...

  10. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...

随机推荐

  1. ELK日志缺失问题排查-Logstash消费过慢问题

    1. 背景 另外一个推荐系统的推荐请求追踪日志,通过ELK收集,方便遇到问题时,可以通过唯一标识sid来复现推荐过程 在一次上线之后,发现日志大量缺失,缺失率达90%,确认是由上线引起的,但因为当时没 ...

  2. MyBatis插件:通用mapper(tk.mapper)

    简单认识通用mapper 了解mapper 作用:就是为了帮助我们自动的生成sql语句 通用mapper是MyBatis的一个插件,是pageHelper的同一个作者进行开发的 作者gitee地址:h ...

  3. Vue3 如何接入 i18n 实现国际化多语言

    1. 基本方法 在 Vue.js 3 中实现网页的国际化多语言,最常用的包是 vue-i18n,通常我们会与 vue-i18n-routing 一起使用. vue-i18n 负责根据当前页面的语言渲染 ...

  4. Task异步多线程

    不废话,直接贴上要实现的效果和代码... [1]直接使用Lambda表达式是实现多线程: using System; using System.Collections.Generic; using S ...

  5. 学习笔记--Java中方法递归调用

    Java中方法递归调用 public class RecursionTest01{ public static void main(String[] args){ System.out.println ...

  6. 配置docker镜像时碰到的问题

    在配置docker镜像时,首先我是这样操作的 , echo "registry-mirrors": ["https://ry1ei7ga.mirror.aliyuncs. ...

  7. CF1934B Yet Another Coin Problem 题解

    CF1934B Yet Another Coin Problem 题解 题意 目前有 \(5\) 种硬币,面值分别为 \(1,3,6,10,15\).给你一个数字 \(n\),求出可以凑出 \(n\) ...

  8. docker redis集群实验

    集群redis 分片+高可用+负载均衡 master + slave{1..5} 一个挂了另一个顶上 通过脚本创建6个redis配置文件 [root@docker ~]# for port in $( ...

  9. SQL实战从在职到离职(1) 如何处理连续查询

    书接上回,最近离职在家了实在无聊,除了看看考研的书,打打dnf手游,也就只能写写代码,结果昨晚挂在某平台的一个技术出售有人下单了,大概业务是需要帮忙辅导一些面试需要用到的SQL. 回想了下,在该平台接 ...

  10. web3 产品介绍:Mirror.xyz是一个创新的去中心化出版平台

    Mirror.xyz是一个创新的去中心化出版平台,它使作者能够创建.发布和管理自己的内容,并与读者建立直接的经济联系.在本文中,我们将介绍Mirror.xyz的主要特点.功能以及如何使用它来发布和消费 ...