Changes

Jump to: navigation, search

Assembler Basics

1,127 bytes added, 15:15, 8 January 2020
6502 Assembly Language in the Emulator
# Data - Values used by the program for things such as initial variable values and string or numeric constants.
Assembler '''directives''' are used to control the assembly of the code, by specifying output file sections (such as .text (machine code), .data (read/write data), or .rodata (read-only data /constants) in an ELF file) and data formats (such as word size for numeric values), and by defining macros.
Consider this x86_64 assembly language "Hello World" program:
<font color="green">mov</font> $<font color="blue">msg</font>,%<font color="blue">rsi</font> /* message location */
<font color="green">mov</font> $<font color="blue">stdout</font>,%<font color="blue">rdi</font> /* file descriptor stdout */
<font color="green">mov</font> $<font color="orange">1</font>,%<font color="blue">rax</font> /* [[Syscalls|syscall ]] sys_write */
<font color="green">syscall</font>
<font color="green">syscall</font>
<font color="red">.datarodata</font>
<font color="blue">msg:</font> <font color="red">.ascii</font> <font color="orange">"Hello, world!\n"</font>
A In GNU assembler, a symbol may be set in one of three ways:
# Using the <code>.set</code> directive (in the example above, len line)
# Using an assignment using an equals sign (in the example above, stdout line), which the GNU assembler treats as an alternative syntax for the <code>.set</code> directive
In the program above:
* .text is a directive (equivalent to the longer directive ".section .text") which specifies that the following instructions/data should be placed in the ".text" section of the output ELF file.
* .data rodata is a similar directive which specifies that the following instructions/data should be placed in the .data rodata section of the output ELF file. In the case of this program, they could alternately be placed in the .rodata data section, which is for read-only write data (data which is write-protected in memory), but .rodata was used because the string is not modified by the program(it's a constant).
* .global (or .globl) is a directive which makes the following symbol visible to the linker. Otherwise, symbols are normally lost by link time. In this case, the linker needs to know the value of the special symbol _start in order to know where execution is to begin in the program (which is not always at the start of the .text section).
* _start is a label which is equivalent to the memory location of the first instruction in the program.
Note also that the syntax will vary from assembler to assembler and from architecture to architecture.
== Essentials 6502 Assembly Language in the Emulator == The [[6502 Emulator]] provides a very simple assembler:* Simple text-substitution macros can be defined with <code>define ''name'' ''value''</code> like this: define SCREEN $f000* The DCB (Declare Constant Byte) directive can be used to create a group of bytes in memory. Byte values are comma-separated and may be double-quoted single printable characters (except space), decimal values, or hexadecimal values prefixed with $, like this: dcb 12,34,56 dcb $33,$66,$CC,$FF dcb "A" dcb "T","e","s","t",$20,"4",".",0* The current assembly pointer starts at $0600 and increments with output bytes; it can be changed with this syntax: *=$0800 To create an assembly language program in the emulator, simply type or paste the code in the text area and hit Assemble. If no error messages are output, the Run button will be enabled, and pressing that will run your code. To save your code, copy and paste it from the text area into an editor. == Assembly Language Program on a Linux System ==
On a Linux system, you will need to meet three requirements to get your assembly language program to work:
The file extension should be <code>.s</code> for assembler source without directives (for compilation with the assembler) or <code>.S</code> for assembler with preprocessor directives (for compilation with gcc).
=== Compiling an Assembly Language Program using the GNU Assembler ===
# Run the assembler: <code>as -g -o ''test''.o ''test''.s</code>
Note that the <code>-g</code> option assembles the program with symbolic debugging information included.
=== Compiling an Assembly Language Program using the NASM Assembler ===
# Run the assembler: <code>nasm -g -f elf64 -o ''test''.o ''test''.s</code>
# The <code>-g</code> option assembles the program with symbolic debugging information included.
=== Compiling an Assembly Language program using GCC ===
# Run the preprocessor, assembler, and linker using the gcc command: <code>gcc -g -o ''test''.o ''test''.S</code>
Note that the <code>-g</code> option assembles the program with symbolic debugging information included, and that the normal GCC optimization options are not available.
=== Instruction Set Architecture Information ===
To get started with specific [[Instruction Set Architecture|instruction set architectures]], see:
* [[aarch64 Register and Instruction Quick Start]]
=== Resources ===
* [https://sourceware.org/binutils/docs/as/ Using as, The GNU Assembler] (GAS manual)

Navigation menu