Example Programs
- Hello world:
hello.ic,hello.s - Fibonacci computation:
fib.ic,fib.s - Objects example:
objects.ic,objects.s
IC Calling conventions
- All function arguments pushed on stack in reverse order
- Return value stored in
%raxregister (not on stack) - Caller-saved registers:
%rax, %rcx, %rdx, %rdi, %rsi, %r8-%r11 - Callee-saved registers:
%rbx, %rbp, %rsp %r12-%r15
x86_64 Instruction Set Architecture
- Duane Bailey's summary of the x86_64 architecture
- Intel Architecture Software Developer's Manual
- Intel Architecture Optimization Manual
- x86-64 Machine-Level Programming
Other Tools
- GDB, the GNU debugger
- Documentation for the as assembler: Postscript, HTML (uses the
AT&T syntax)
AT&T versus Intel Syntax
| AT&T | Intel | |
|---|---|---|
| Order of operands |
op a,b means b = a op b (second operand is destination) |
op a, b means a = a op b (first operand is destination) |
| Memory addressing |
disp(base, offset, scale)
|
[base + offset*scale + disp]
|
| Size of memory operands |
instruction suffixes (b,w,l,q) (e.g., movb,
movw, movl, movq)
|
operand prefixes (e.g., byte ptr, word
ptr, dword ptr, qword ptr)
|
| Registers |
%rax, %rbx, etc.
|
rax, rbx, etc.
|
| Constants |
$4, $foo, etc.
|
4, foo, etc.
|
Assembling and linking commands
To assemble and link the file "file.s" on our Linux lab
computers, use:
gcc -m64 -g -o file.exe file.s libic64.a
The -m64 flag turns on 64-bit mode. The -g
flag causes debugging info to be placed in the executable.
The library file libic64.a is a collection of .o files
bundled together, containing the code for all of the library functions
defined in the language specification, along with run-time support for
garbage collection. The PA 3 release places the built libraries in your
repository under lib/
(git pull upstream main); a Linux build is also
downloadable here: libic64.a.gz. Ask me if you
are curious about the libic source code.