2019-06-23 12:40:18 +02:00
|
|
|
# The OS/K Team licenses this file to you under the MIT license.
|
|
|
|
# See the LICENSE file in the project root for more information.
|
|
|
|
|
2019-07-17 20:26:03 +02:00
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# Jump instructions #
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
#
|
|
|
|
# Jump (JMP) instruction
|
|
|
|
#
|
|
|
|
# RIP = $1
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
jmp 1
|
2019-07-17 20:26:03 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# RCX-dependent jump (LOOP) instruction
|
|
|
|
#
|
|
|
|
# IF (RCX > 0) THEN
|
|
|
|
# RCX = RCX - 1
|
|
|
|
# RIP = $1
|
|
|
|
# FI
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
loop 1
|
2019-07-17 20:26:03 +02:00
|
|
|
|
|
|
|
#
|
2019-08-08 18:39:12 +02:00
|
|
|
# Conditional absolute jumps (branches) (BCH)
|
2019-07-17 20:26:03 +02:00
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# COMPARE(SignExtend($1), $2)
|
2019-07-17 20:26:03 +02:00
|
|
|
#
|
|
|
|
# IF (COND) THEN
|
|
|
|
# RIP = $3
|
|
|
|
# FI
|
|
|
|
#
|
|
|
|
# Sets CF, OF, ZF and SF according to the comparison's results
|
|
|
|
#
|
|
|
|
# This instruction is special in that the COND field specified is not evaluated
|
|
|
|
# before the instruction is executed, but after the comparison it effectuates
|
|
|
|
#
|
|
|
|
# Suffixing B with the REP suffix results in undefined behavior
|
|
|
|
#
|
2019-08-08 18:39:12 +02:00
|
|
|
bch 3
|
2019-07-17 20:26:03 +02:00
|
|
|
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# Stack manipulation instructions #
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
#
|
|
|
|
# Unconditional jump with possible return (CALL)
|
|
|
|
#
|
|
|
|
# PUSH(RIP)
|
|
|
|
# JMP(RIP)
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
call 1
|
2019-08-08 18:39:12 +02:00
|
|
|
call 2
|
|
|
|
call 3
|
2019-07-17 20:26:03 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Return to caller (RET)
|
|
|
|
#
|
|
|
|
# POP(RIP)
|
|
|
|
#
|
|
|
|
ret
|
|
|
|
|
|
|
|
#
|
|
|
|
# Make new stack frame (ENTER)
|
|
|
|
#
|
|
|
|
# PUSH(RBP)
|
|
|
|
# RBP = RSP
|
|
|
|
# RSP = RSP - $1
|
|
|
|
#
|
2019-08-08 18:39:12 +02:00
|
|
|
enter
|
2019-08-03 17:41:44 +02:00
|
|
|
enter 1
|
2019-07-17 20:26:03 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Leave stack frame (LEAVE)
|
|
|
|
#
|
|
|
|
# RSP = RBP
|
|
|
|
# POP(RBP)
|
|
|
|
#
|
|
|
|
leave
|
|
|
|
|
|
|
|
#
|
|
|
|
# PUSH value onto stack
|
|
|
|
#
|
|
|
|
# RSP = RSP - 8
|
|
|
|
# *RSP = $1
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
push 1
|
2019-08-08 18:39:12 +02:00
|
|
|
push 2
|
|
|
|
push 3
|
2019-07-17 20:26:03 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# POP value from stack
|
|
|
|
#
|
|
|
|
# $1 = *RSP
|
|
|
|
# RSP = RSP + 8
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
pop 1
|
2019-08-08 18:39:12 +02:00
|
|
|
pop 2
|
|
|
|
pop 3
|
2019-07-17 20:26:03 +02:00
|
|
|
|
2019-06-23 12:40:18 +02:00
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
# Movement instructions #
|
|
|
|
#---------------------------------------------------------------------------#
|
|
|
|
|
|
|
|
#
|
|
|
|
# Load Effective Address (LEA) instruction
|
|
|
|
#
|
|
|
|
# $1 = ADDR($2)
|
|
|
|
#
|
|
|
|
# For instance:
|
2019-07-18 22:49:31 +02:00
|
|
|
# LEA RAX, [RBX + RCX * 2 + 4]
|
2019-06-23 12:40:18 +02:00
|
|
|
# will result in:
|
2019-07-18 22:49:31 +02:00
|
|
|
# RAX = RBX + RCX * 2 + 4
|
2019-06-23 12:40:18 +02:00
|
|
|
#
|
|
|
|
# Preserves all flags
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
lea 2
|
2019-06-23 12:40:18 +02:00
|
|
|
|
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# Move data (MOV) instruction
|
2019-06-23 12:40:18 +02:00
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# $1 = SignExtend($2)
|
2019-06-23 12:40:18 +02:00
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
mov 2
|
2019-07-04 20:33:49 +02:00
|
|
|
|
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# Load from memory with zero-extension (MOVSX/MOVZX) instruction
|
2019-07-04 20:33:49 +02:00
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# $1 = ZeroExtend($2)
|
2019-07-04 20:33:49 +02:00
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
movzx 2
|
2019-06-23 12:40:18 +02:00
|
|
|
|
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# Move with sign-extension (MOVSXx) instruction
|
2019-06-23 12:40:18 +02:00
|
|
|
#
|
2019-07-24 16:52:26 +02:00
|
|
|
# $1 = SignExtend($2 & (2^(8 * sizeof(x)) - 1)
|
2019-06-23 12:40:18 +02:00
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
movsxb 2
|
|
|
|
movsxw 2
|
|
|
|
movsxd 2
|
2019-06-23 12:40:18 +02:00
|
|
|
|
|
|
|
#
|
|
|
|
# Exchange (XCHG) instruction
|
|
|
|
#
|
|
|
|
# $_ = $1
|
|
|
|
# $1 = $2
|
|
|
|
# $2 = $_
|
|
|
|
#
|
2019-08-03 17:41:44 +02:00
|
|
|
xchg 2
|
2019-06-23 12:40:18 +02:00
|
|
|
|