0

I am writing a program that writes the contents from one file into another. What I am doing now (for testing) is to open the two files and write an string in one of them. The program doesn't show up any error, however nothing is writing in the file.

Here is my code

BITS 32 section .data msg db "Hola" section .bss src_file resb 1 ; Source file descriptor dest_file resb 1 ; Destination file descriptor section .text global _start _start: pop ebx ; argc pop ebx ; argv[0] nombre del ejecutable pop ebx ; src file name ;; Open src file mov ecx,1 ; Write mode mov eax,5 ; sys_open() int 0x80 ; Interruption 80. kernel call mov [src_file],eax pop ebx ; dest file name ;; Open dest file mov ecx,1 ; Write mode mov eax,5 ; sys_open() int 0x80 ; Interruption 80. kernel call mov [dest_file],eax ;; Writes in src file mov edx,4 ; Long mov ecx,msg ; text mov ebx,[src_file] ; File descriptor of dest file mov eax,4 int 0x80 ;; Closes src file mov ebx,[src_file] ; File descriptor of src file mov eax,6 ; sys_close() int 0x80 ; Kernel call ;; Closes dest file mov ebx,[dest_file] ; File descriptor of src file mov eax,6 ; sys_close() int 0x80 ; Kernel call ;; Exits the program mov ebx,0 ; OS exit code mov eax,1 ; sys_exit int 0x80 ; Kernel call 

I think maybe there is something wrong in storing the file descriptor after opening a file because if I move the block of code which writes into the file right after opening the source file it works just fine.

Thanks for the help!

1 Answer 1

2
src_file resb 1 ; Source file descriptor dest_file resb 1 ; Destination file descriptor 

1 byte for the file descriptors will not cut it. When you do a 4-byte load like mov ebx,[src_file], the 2nd-lowest byte of EBX will come from the dest_file byte instead of being zero, so the read or write system call will return -EBADF. They need to be DWORD sized variables!

src_file resd 1 ; Source file descriptor dest_file resd 1 ; Destination file descriptor 

The program doesn't show up any error

Why would the program show an error? You never told it to! This is Assembly, nothing is automatic. The CPU happily put the file descriptors where you told it to, and just overwrote whatever was after them since they weren't big enough.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you! I'm beginning to program in Assembly and I still don't understand very well the sizes of the variables. Thanks
For 32bit, just about everything will be DWORD sized variables unless noted in the documentation for the function/library. Pointers are DWORD, return values are DWORD, etc...

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.