RT 64位ubuntu
addq 8, %rsp
popq %rdx
.include "linux.s"
.include "record_def.s"
.section .data
file_name:
.ascii "test.dat\0"
.section .bss
.lcomm record_buffer, RECORD_SIZE
.section .text
.globl _start
_start:
.equ ST_INPUT_DESCRIPTOR, -8
.equ ST_OUTPUT_DESCRIPTOR, -16
movq %rsp, %rbp
subq $16, %rsp
movl $SYS_OPEN, %eax
movl $file_name, %ebx
movl $O_RDONLY, %ecx
movl $0666, %edx
int $LINUX_SYSCALL
movq %rax, ST_INPUT_DESCRIPTOR(%rbp)
movq $STDOUT, ST_OUTPUT_DESCRIPTOR(%rbp)
record_read_loop:
pushq ST_INPUT_DESCRIPTOR(%rbp)
pushq $record_buffer
call read_record
addq $16, %rsp
cmpl $RECORD_SIZE, %eax
jne finished_reading
pushq $RECORD_FIRSTNAME + record_buffer
call count_chars
//addq 8, %rsp
popq %rdx
movl %eax, %edx
movq ST_OUTPUT_DESCRIPTOR(%rbp), %rbx
movl $SYS_WRITE, %eax
movl $RECORD_FIRSTNAME + record_buffer, %ecx
int $LINUX_SYSCALL
pushq ST_OUTPUT_DESCRIPTOR(%rbp)
call write_newline
addq $8, %rsp
jmp record_read_loop
finished_reading:
movl $SYS_EXIT, %eax
movl $0, %ebx
int $LINUX_SYSCALL
这样程序能正常运行,但是把popq %rdx 换成addq 8, %rsp(程序中用//屏蔽的)
就会段错误。。。。
------解决方案--------------------
addq 8, %rsp?
应该是
addq $8, %rsp吧
------解决方案--------------------
看System V ABI
3.4 Process Initialization
3.4.1 Initial Stack and Register State
那部分。
简单说,
[rsp] <- 参数数量,也就是argc了
[rsp+8] <- 第一个参数地址,如果有的话
[rsp+16] <- 第二个参数地址...
...
[rsp+argc*8+8] <- 0
之后
第一个环境变量指针
第二个环境变量指针
...