x86程序集(AT& T)将长写入.dat文件

时间:2017-11-28 11:26:51

标签: ubuntu assembly x86 ascii att

编辑:我认为将它写入文件工作正常,我不认为练习要求我实际上能够看到数字。

我正在尝试将一个包含一些字符串和长整数的缓冲区写入.dat文件。字符串很好,但长出来的ascii版本(作为字符)。 这段代码来自于Ground Up的编程,是32位的,在64位Ubuntu上使用as --32ld -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并以某种方式使用商和余数)之前,我想确定问题首先在哪里。

0 个答案:

没有答案