Compile/run assembler in Linux?

后端 未结 8 1753
清歌不尽
清歌不尽 2020-12-22 18:05

I\'m fairly new to Linux (Ubuntu 10.04) and a total novice to assembler. I was following some tutorials and I couldn\'t find anything specific to Linux. So, my question is,

相关标签:
8条回答
  • 2020-12-22 18:22

    There is also FASM for Linux.

    format ELF executable
    
    segment readable executable
    
    start:
    mov eax, 4
    mov ebx, 1
    mov ecx, hello_msg
    mov edx, hello_size
    int 80h
    
    mov eax, 1
    mov ebx, 0
    int 80h
    
    segment readable writeable
    
    hello_msg db "Hello World!",10,0
    hello_size = $-hello_msg
    

    It comiles with

    fasm hello.asm hello
    
    0 讨论(0)
  • 2020-12-22 18:23

    The assembler(GNU) is as(1)

    0 讨论(0)
  • 2020-12-22 18:27

    My suggestion would be to get the book Programming From Ground Up:

    http://nongnu.askapache.com/pgubook/ProgrammingGroundUp-1-0-booksize.pdf

    That is a very good starting point for getting into assembler programming under linux and it explains a lot of the basics you need to understand to get started.

    0 讨论(0)
  • 2020-12-22 18:28

    The GNU assembler is probably already installed on your system. Try man as to see full usage information. You can use as to compile individual files and ld to link if you really, really want to.

    However, GCC makes a great front-end. It can assemble .s files for you. For example:

    $ cat >hello.s <<"EOF"
    .section .rodata             # read-only static data
    .globl hello
    hello:
      .string "Hello, world!"    # zero-terminated C string
    
    .text
    .global main
    main:
        push    %rbp
        mov     %rsp,  %rbp                 # create a stack frame
    
        mov     $hello, %edi                # put the address of hello into RDI
        call    puts                        #  as the first arg for puts
    
        mov     $0,    %eax                 # return value = 0.  Normally xor %eax,%eax
        leave                               # tear down the stack frame
        ret                            # pop the return address off the stack into RIP
    EOF
    $ gcc hello.s -no-pie -o hello
    $ ./hello
    Hello, world!
    

    The code above is x86-64. If you want to make a position-independent executable (PIE), you'd need lea hello(%rip), %rdi, and call puts@plt.

    A non-PIE executable (position-dependent) can use 32-bit absolute addressing for static data, but a PIE should use RIP-relative LEA. (See also Difference between movq and movabsq in x86-64 neither movq nor movabsq are a good choice.)

    If you wanted to write 32-bit code, the calling convention is different, and RIP-relative addressing isn't available. (So you'd push $hello before the call, and pop the stack args after.)


    You can also compile C/C++ code directly to assembly if you're curious how something works:

    $ cat >hello.c <<EOF
    #include <stdio.h>
    int main(void) {
        printf("Hello, world!\n");
        return 0;
    }
    EOF
    $ gcc -S hello.c -o hello.s
    

    See also How to remove "noise" from GCC/clang assembly output? for more about looking at compiler output, and writing useful small functions that will compile to interesting output.

    0 讨论(0)
  • 2020-12-22 18:30

    If you are using NASM, the command-line is just

    nasm -felf32 -g -Fdwarf file.asm -o file.o
    

    where 'file.asm' is your assembly file (code) and 'file.o' is an object file you can link with gcc -m32 or ld -melf_i386. (Assembling with nasm -felf64 will make a 64-bit object file, but the hello world example below uses 32-bit system calls, and won't work in a PIE executable.)

    Here is some more info:

    http://www.nasm.us/doc/nasmdoc2.html#section-2.1

    You can install NASM in Ubuntu with the following command:

    apt-get install nasm
    

    Here is a basic Hello World in Linux assembly to whet your appetite:

    http://web.archive.org/web/20120822144129/http://www.cin.ufpe.br/~if817/arquivos/asmtut/index.html

    I hope this is what you were asking...

    0 讨论(0)
  • 2020-12-22 18:33

    For Ubuntu 18.04 installnasm . Open the terminal and type:

    sudo apt install as31 nasm

    nasm docs

    For compiling and running:

    nasm -f elf64 example.asm # assemble the program  
    ld -s -o example example.o # link the object file nasm produced into an executable file  
    ./example # example is an executable file
    
    0 讨论(0)
提交回复
热议问题