How to write data into an external file on Linux?
For instance, if I start the code with .include "output.s"
and want to write "1111 0000" into it, then how to do this.
How to write data into an external file on Linux?
For instance, if I start the code with .include "output.s"
and want to write "1111 0000" into it, then how to do this.
The best way to do file I/O is to use the libc. Envision how you would do it in C, then do the same thing in assembly. For example, in C you could do
int main() {
ssize_t n;
int fd;
char buf[9] = "1111 0000";
fd = creat("output.s", 0666);
if (fd == -1) {
perror("output.s");
return (EXIT_FAILURE);
}
n = write(fd, buf, sizeof buf);
if (n == -1) {
perror("output.s");
return (EXIT_FAILURE);
}
close(fd);
return (EXIT_SUCCESS);
}
Next, translate the code step by step into assembly:
.data
name: .string "output.s" # the file name
buf: .ascii "1111 0000"
buflen= .-buf # the length of buf
.text
.globl main
.type main, @function
main: push %rbx # free rbx and align stack
lea name(%rip), %rdi # file name
mov $0666, %esi # initial permissions
call creat # create the file
cmp $-1, %eax # was the call successful?
je .Lfail # if not, process error
mov %eax, %ebx # stash a copy of the file descriptor
mov %eax, %edi # file descriptor
lea buf(%rip), %rsi # buffer
mov $buflen, %edx # buffer length
call write # write data
cmp $-1, %rax # was the call successful?
je .Lfail # if not, process error
mov %ebx, %edi # file descriptor
call close # close the file
xor %eax, %eax # return EXIT_SUCCESS
pop %rbx # restore %rbx
ret
.Lfail: lea name(%rip), %rdi # the file name
call perror # print an error message
mov $1, %eax # return EXIT_FAILURE
pop %rbx # restore %rbx
ret
.size main, .-main