我目前正在学校学习x86汇编语言,所以我可以问一个愚蠢的问题(尽管我没有发现任何有用的东西)。
我在主文件的 data 部分中声明了一些全局变量,然后我有第二个文件,其中有两个函数使用这些全局变量。
.section .data
.globl file_desc
.globl init
.globl reset
.globl rpm
file_desc: .long
init: .int
reset: .int
rpm: .long
在_start部分,我调用 sys_open 系统调用来获取文件描述符,并将其保存在 file_desc 变量中。 然后我在另一个文件中调用一个函数:
read_init:
# read the INIT and convert it
movl $SYS_READ, %eax
movl file_desc, %ebx
leal init, %ecx
movl $1, %edx
int $0x80
cmp $0, %eax # check for EOF
jle eof
jmp get_init
eof:
movl $47, init # we make the init to -1 xD
get_init:
subb $48, init # get the real value of INIT
# skip 1 byte
movl $SYS_SEEK, %eax
movl file_desc, %ebx
movl $1, %ecx
movl $1, %edx
int $0x80
ret
问题是,当我到达 sys_lseek 系统调用时,file_desc已被修改!我使用GDB进行调试以查看它,并且在调用read syscall之后,该值不一样。
理论上它不应该修改它,那么我的程序到底是什么?