【发布时间】:2015-07-19 19:26:29
【问题描述】:
测试在64-bit x86 Linux 上进行。
我有一些x86 32-bit 汇编代码,它试图将大量日志数据写入磁盘。是这样的:
logging_flush:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $438, 8(%esp) <--- 666
movl $1089, 4(%esp) <--- O_WRONLY|O_APPEND|O_CREAT
movl $.LC1, (%esp)
call open
movl %eax, 28(%esp)
movl $buf, %eax
movl $0x1000000, 8(%esp)
movl %eax, 4(%esp)
movl 28(%esp), %eax
movl %eax, (%esp)
call write
movl 28(%esp), %eax
movl %eax, (%esp)
call close
leave
ret
section .rodata
.LC1:
.string "trace.bin"
但是,由于大小限制,转储日志文件的大小不会大于2G。
我尝试用这种方式编译我的代码:
gcc final.s -D_FILE_OFFSET_BITS=64 -m32 -lm
但是没有字节可以写入日志文件..
我也尝试使用fopen64,但它无法正常工作。我在这里错过了什么吗?谁能帮我调整一下上面的汇编代码?
【问题讨论】:
-
你实际上不是编译,而是汇编。您添加 C 标签的原因是什么?
-
你没有检查
open(2)的返回值。用 C 编写这部分。系统调用所花费的 CPU 时间将使您的 asm 和编译器输出之间的差异相形见绌。
标签: assembly x86 x86-64 file-writing