Crate write_x86_64

Source
Expand description

Module to help people generate x86_64 code in Rust

Inspired from https://www.lri.fr/~filliatr/ens/compil/lib/x86_64.ml.html

This crate wants to be an equivalent of the above code

For writting files see

[data::Data], file::File and Text data structures

Registers %rax -> %r15 are all accessible for 8, 16, 32 and 64 bits. Write name in capital letters to access them

Operands can be obtained with lab, ilab, addr, reg! and immb to immq.

All instruction are available for various sizes.

Transfert instruction : movq

Arithmetic : leaq, incq, decq, negq, addq, subq, imulq, cqto, idivq, divq

Logic : notq, andq, orq, xorq

Shifts : shlq, shrq, sarq

Jumps : call, call_star, leave, ret, jmp, jmp_star, jcc

Conditions : cmpb, testq, set, cmovq

Stack : pushq, popq

Various others : [label], comment

Modules§

data
Define data segment
debug
Defines debug symbols
directives
Defines directives
file
Define structure for whole file
instr
Defines instructions
reg
Defines registers and operands
traits
Defines various traits

Macros§

addr
Create an Operand (for any type R) to access memory
ilab
ilab operator from https://www.lri.fr/~filliatr/ens/compil/lib/x86_64.ml.html
lab
lab operator from https://www.lri.fr/~filliatr/ens/compil/lib/x86_64.ml.html
reg
Macro to convert an element of type R with the trait Reg to an element of type Operand

Structs§

NamedSegment
Named Segment
Segment
Segment
SegmentELWrapper
Wrapper around a segment element to store a potential comment

Enums§

SegmentEL
Structure representing a segment element

Constants§

AH
8-bits registers (1 byte)
AL
8-bits registers (1 byte)
AX
16-bits registers (2 bytes)
BH
8-bits registers (1 byte)
BL
8-bits registers (1 byte)
BP
16-bits registers (2 bytes)
BPL
8-bits registers (1 byte)
BX
16-bits registers (2 bytes)
CH
8-bits registers (1 byte)
CL
8-bits registers (1 byte)
CX
16-bits registers (2 bytes)
DH
8-bits registers (1 byte)
DI
16-bits registers (2 bytes)
DIL
8-bits registers (1 byte)
DL
8-bits registers (1 byte)
DX
16-bits registers (2 bytes)
EAX
32-bits registers (4 bytes)
EBP
32-bits registers (4 bytes)
EBX
32-bits registers (4 bytes)
ECX
32-bits registers (4 bytes)
EDI
32-bits registers (4 bytes)
EDX
32-bits registers (4 bytes)
ESI
32-bits registers (4 bytes)
ESP
32-bits registers (4 bytes)
R8
64-bits registers (8 bytes)
R9
64-bits registers (8 bytes)
R8B
8-bits registers (1 byte)
R8D
32-bits registers (4 bytes)
R8W
16-bits registers (2 bytes)
R9B
8-bits registers (1 byte)
R9D
32-bits registers (4 bytes)
R9W
16-bits registers (2 bytes)
R10
64-bits registers (8 bytes)
R11
64-bits registers (8 bytes)
R12
64-bits registers (8 bytes)
R13
64-bits registers (8 bytes)
R14
64-bits registers (8 bytes)
R15
64-bits registers (8 bytes)
R10B
8-bits registers (1 byte)
R10D
32-bits registers (4 bytes)
R10W
16-bits registers (2 bytes)
R11B
8-bits registers (1 byte)
R11D
32-bits registers (4 bytes)
R11W
16-bits registers (2 bytes)
R12B
8-bits registers (1 byte)
R12D
32-bits registers (4 bytes)
R12W
16-bits registers (2 bytes)
R13B
8-bits registers (1 byte)
R13D
32-bits registers (4 bytes)
R13W
16-bits registers (2 bytes)
R14B
8-bits registers (1 byte)
R14D
32-bits registers (4 bytes)
R14W
16-bits registers (2 bytes)
R15B
8-bits registers (1 byte)
R15D
32-bits registers (4 bytes)
R15W
16-bits registers (2 bytes)
RAX
64-bits registers (8 bytes)
RBP
64-bits registers (8 bytes)
RBX
64-bits registers (8 bytes)
RCX
64-bits registers (8 bytes)
RDI
64-bits registers (8 bytes)
RDX
64-bits registers (8 bytes)
RSI
64-bits registers (8 bytes)
RSP
64-bits registers (8 bytes)
SI
16-bits registers (2 bytes)
SIL
8-bits registers (1 byte)
SP
16-bits registers (2 bytes)
SPL
8-bits registers (1 byte)

Functions§

addb
Instructions between 1-bytes operands
addl
Instructions between 4-bytes operands
addq
Instructions between 8-bytes operands
addw
Instructions between 2-bytes operands
andb
Instructions between 1-bytes operands
andl
Instructions between 4-bytes operands
andq
Instructions between 8-bytes operands
andw
Instructions between 2-bytes operands
call
Call label
call_star
Call address
cltd
sign extend EAX into EDX::EAX
cmovl
Conditional move of 4-bytes operands
cmovq
Conditional move of 8-bytes operands
cmovw
Conditional move of 2-bytes operands
cmpb
Instructions between 1-bytes operands
cmpl
Instructions between 4-bytes operands
cmpq
Instructions between 8-bytes operands
cmpw
Instructions between 2-bytes operands
comment
Add comment to Assembly (should not contain de line break!)
cqto
sign extend RAX into RDX::RAX
decb
Instructions on 1-bytes operands
decl
Instructions on 4-bytes operands
decq
Instructions on 8-bytes operands
decw
Instructions on 2-bytes operands
deplq
Move address of label in register (implementation is OS dependant)
divl
Instructions on 4-bytes operands
divq
Instructions on 8-bytes operands
idivl
Instructions on 4-bytes operands
idivq
Instructions on 8-bytes operands
immb
Immediate operand for 8-bits instructions
imml
Immediate operand for 32-bits instructions
immq
Operands Immediate operand for 64-bits instructions
immw
Immediate operand for 16-bits instructions
imull
Instructions between 4-bytes operands
imulq
Instructions between 8-bytes operands
imulw
Instructions between 2-bytes operands
incb
Instructions on 1-bytes operands
incl
Instructions on 4-bytes operands
incq
Instructions on 8-bytes operands
incw
Instructions on 2-bytes operands
inline
Directly inline assembly code
jae
Conditional jump if above equal
jcc
Conditional jump
jmp
Jump to label
jmp_star
Jump to address
jnz
Conditional jump if not zero
jz
Conditional jump if zero
leab
Instructions between 1-bytes operands
leal
Instructions between 4-bytes operands
leaq
Instructions between 8-bytes operands
leave
Leave instruction
leaw
Instructions between 2-bytes operands
movb
Instructions between 1-bytes operands
movl
Instructions between 4-bytes operands
movq
Instructions between 8-bytes operands
movsbl
Sign extend for 1-byte to 4-bytes
movsbq
Sign extend for 1-byte to 8-bytes
movsbw
Sign extend for 1-byte to 2-bytes
movslq
Sign extend for 4-byte to 8-bytes
movswl
Sign extend for 2-byte to 4-bytes
movswq
Sign extend for 2-byte to 8-bytes
movw
Instructions between 2-bytes operands
movzbl
Extension with zeros for 1-byte to 4-bytes
movzbq
Extension with zeros for 1-byte to 8-bytes
movzbw
Extension with zeros for 1-byte to 2-bytes
movzwl
Extension with zeros for 2-byte to 4-bytes
movzwq
Extension with zeros for 2-byte to 8-bytes
negb
Instructions on 1-bytes operands
negl
Instructions on 4-bytes operands
negq
Instructions on 8-bytes operands
negw
Instructions on 2-bytes operands
new_label
Convert str to label name
nop
nop instruction (does nothing)
notb
Instructions on 1-bytes operands
notl
Instructions on 4-bytes operands
notq
Instructions on 8-bytes operands
notw
Instructions on 2-bytes operands
orb
Instructions between 1-bytes operands
orl
Instructions between 4-bytes operands
orq
Instructions between 8-bytes operands
orw
Instructions between 2-bytes operands
popq
Pop 8-bytes from stack
pushq
Push 8-bytes on stack
ret
Equivalent to popq %rip
sarb
Instructions between 1-bytes operands
sarl
Instructions between 4-bytes operands
sarq
Instructions between 8-bytes operands
sarw
Instructions between 2-bytes operands
set
Conditionnal set
shlb
Instructions between 1-bytes operands
shlb_reg
logical shift of register by value in CL
shll
Instructions between 4-bytes operands
shll_reg
logical shift of register by value in CL
shlq
Instructions between 8-bytes operands
shlq_reg
logical shift of register by value in CL
shlw
Instructions between 2-bytes operands
shlw_reg
logical shift of register by value in CL
shrb
Instructions between 1-bytes operands
shrb_reg
logical shift of register by value in CL
shrl
Instructions between 4-bytes operands
shrl_reg
logical shift of register by value in CL
shrq
Instructions between 8-bytes operands
shrq_reg
logical shift of register by value in CL
shrw
Instructions between 2-bytes operands
shrw_reg
logical shift of register by value in CL
subb
Instructions between 1-bytes operands
subl
Instructions between 4-bytes operands
subq
Instructions between 8-bytes operands
subw
Instructions between 2-bytes operands
testb
Instructions between 1-bytes operands
testl
Instructions between 4-bytes operands
testq
Instructions between 8-bytes operands
testw
Instructions between 2-bytes operands
xorb
Instructions between 1-bytes operands
xorl
Instructions between 4-bytes operands
xorq
Instructions between 8-bytes operands
xorw
Instructions between 2-bytes operands

Type Aliases§

Data
Type alias representing the data Segment
Text
Type alias representing the text Segment