我正在尝试将一个包含一些字符串和长整数的缓冲区写入.dat文件。字符串很好,但长出来的ascii版本(作为字符)。
这段代码来自于Ground Up的编程,是32位的,在64位Ubuntu上使用as --32
和ld -melf_i386
编译,这没有给我带来其他例子的问题(或者这个除了这里描述的问题)。
具体来说,在下面的代码中,我将数字45加载到将写入.dat文件的记录中:
record1:
.ascii "Fredrick\0" # converts string into byte data
.rept 31 # padding to 40 bytes
.byte 0 # inserts a 0 at the end of the field
.endr
.ascii "Bartlett\0" # converts string into byte data
.rept 31 # padding to 40 bytes
.byte 0 # inserts a 0 at the end of the field
.endr
.ascii "4242 S Prairie\nTulsa, OK 55555\0" # converts string into byte data
.rept 209 # padding to 240 bytes
.byte 0 # inserts a 0 at the end of the field
.endr
.long 45 # age of this contact = 45
# long is already 4 bytes
然后整个记录最终传递给函数write_record
:
pushl ST_FILE_DESCRIPTOR(%ebp)
pushl $record1
call write_record
addl $8, %esp
函数write_record
是这样的:
write_record:
pushl %ebp # save old base pointer
movl %esp, %ebp # make stack pointer the base pointer
pushl %ebx
movl $SYS_WRITE, %eax
movl ST_FILEDES(%ebp), %ebx
movl ST_WRITE_BUFFER(%ebp), %ecx
movl $RECORD_SIZE, %edx
int $LINUX_SYSCALL # execute system call,
# sys_write returns # bytes written in %eax
# which is returned to the calling program
popl %ebx
movl %ebp, %esp # restore stack pointer
popl %ebp # restore base pointer
ret
名称和地址很好,但45是连字符( - )。在其他记录中,数字29表示为空格,36表示为$。
使用gedit打开时.dat文件和终端show these values。
如何打印实际值45,29,36 ......?
此代码是否应将ascii字符写入.dat文件,还是应该写入数字?
如果它向文件写错了,我怎么能让它写文件而不是字符?本书提供的代码应该可以正常使用,至少在32位环境中是如此。这可能是一个32对64位的问题吗?
如果它正确地写入文件,我的问题在于我的读取功能,那里需要进行转换,不是吗?在我尝试进行一些我已经读过的转换(除以10并以某种方式使用商和余数)之前,我想确定问题首先在哪里。