写点什么

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

作者:codists
  • 2024-08-24
    广东
  • 本文字数:2840 字

    阅读完需:约 9 分钟

《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, @functionread_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 .datarecord1: .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)

用户头像

codists

关注

公众号:编程人 2021-01-14 加入

Life is short, You need Python

评论

发布
暂无评论
《Programming from the Ground Up》阅读笔记:p103-p116_汇编_codists_InfoQ写作社区