当前位置: 代码迷 >> 汇编语言 >> 这两条汇编指令有何差别
  详细解决方案

这两条汇编指令有何差别

热度:75   发布时间:2016-05-02 04:32:40.0
这两条汇编指令有何区别
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
之后
第一个环境变量指针
第二个环境变量指针
...

  相关解决方案