Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

assembly store text into an external file

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.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

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_SUCCESS
        pop     %rbx                    # restore %rbx
        ret

        .size   main, .-main
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading