你的分享就是我们的动力 ---﹥

这两条汇编指令有何差别

时间:2014-08-22 18:28来源:www.chengxuyuans.com 点击:
这两条汇编指令有何区别
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
之后
第一个环境变量指针
第二个环境变量指针
...

转载注明地址:http://www.chengxuyuans.com/Hardware/assembly-language/80543.html

推荐文章