| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- \documentclass{article}
- \usepackage{lmodern}
- \usepackage[T1]{fontenc}
- \usepackage{geometry}
- \usepackage{array}
- \newcolumntype{@}{>{\global\let\currentrowstyle\relax}}
- \newcolumntype{^}{>{\currentrowstyle}}
- \newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
- #1\ignorespaces
- }
- % Configuración de parrafos
- \setlength{\parskip}{1em}
- % Margenes
- \geometry{
- a4paper,
- total={210mm,297mm},
- left=15mm,
- right=10mm,
- top=15mm,
- bottom=10mm,
- includehead, includefoot
- }
- \textwidth=6in
- \textheight=9.0in
- \begin{document}
- \section{Saltos}
- \textbf {JA} = Above/not below or equal | (CF or ZF) = 0 \\
- \textbf {JAE} = Above or equal/not below | CF = 0 \\
- \textbf {JE} = Equal/zero | ZF = 1 \\
- \textbf {JZ} = Equal/zero | ZF = 1 \\
- \textbf {JGE} = Greater or equal/not less | (SF xor OF) = 0 \\
- \textbf {JG} = Greater/not less or equal | ((SF xor OF) or ZF) = 0 \\
- \textbf {JO} = Overflow | OF = 1 \\
- \textbf {JECXZ} = Register ECX is zero | ECX = 0 \\
- \section{Registros}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf{8 bits}: AL, BL, CL, DL, DIL, SIL, BPL, SPL, R8L, R9L, R10L, R11L, R12L, R13L, R14L, R15L \item \textbf{16 bits}: AX, BX, CX, DX, DI, SI, BP, SP, R8W, R9W, R10W, R11W, R12W, R13W, R14W, R15W
- \item \textbf{32 bits}: EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D
- \item \textbf{64 bits}: RAX, RBX, RCX, RDX, RSI, RDI, RPB, RSP, R8, R9, R10, R11, R12, R13, R14, R15
- \item \textbf{128 bits}: XMM0-XMM15
- \end{itemize}
- \section{Secciones y Etiquetas}
- \subsection*{Secciones}
- \textbf{.data}: Variables \\
- \textbf{.rodata}: Constantes \\
- \textbf{.text}: C\'odigo \\
- \subsection*{Etiquetas}
- \textbf{global}: Define un s\'imbolo que va a ser visto externamente \\
- \textbf{\_start}: Punto de entrada de un programa en linux \\
- \textbf{extern}: Llamar funci\'on externa
- \subsection*{Pseudoinstrucciones}
- Prefijo \textbf{TIMES}, para repetir una cantidad de veces la instrucci\'on que sigue
- \section*{Instrucciones}
- \begin{tabular}[l]{ |@l|>{\itshape}^l|^l| }
- \hline
- \rowstyle{\bfseries}
- Instruccion & Formato & Descripcion \\
- \hline
- DB, DW, DD, DQ & -- & Definir datos \\
- SHR & reg, imm & Hace un shift right l\'ogico (sin signo) \\
- SAR & reg, imm & Hace un shift right aritm\'etico (con signo) \\
- LEA & reg1, [ reg * imm + imm/reg ] & Evalua lo que hay entre corchetes y lo almacena en reg1 \\
- MOVZX & ???? & En las diapos decia que servia para algo \\
- CBW & ???? & En las diapos decia que servia para algo \\
- CDQE & ???? & En las diapos decia que servia para algo \\
- MOV & (tam), mem/imm & Para el caso de inmediato o mem, especificar tam \\
- CMP & (tam), mem/imm & Para el caso de inmediato o mem, especificar tam \\
- MOVQ & xmm, reg & Muevo de registro a registro XMM \\
- CLD & -- & Seteo flag de direcci\'on (forward) \\
- REP & instruccion & Repito RCX veces la instrucci\'on siguiente \\
- MOVSB & -- & Mueve el contenido de donde apunta RSI y lo almacena a donde apunta RDI, despues aumenta ¿en 1? los dos registros \\
- \hline
- \end{tabular}
- \section{Convenci\'on C}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item RBX, R12, R13, R14 y R15 \\
- \item Retornar el resultado RAX o XMM0 \\
- \item No romper la pila \\
- \item Antes de llamar, alinear la pila a 16 bytes \\
- \end{itemize}
- \subsection*{Stack Frame}
- \textbf{PUSH RBP} \\
- \textbf{MOV RBP, RSP} \\
- ... \\
- \textbf{SUB RSP, 8 }; para alinear, variables locales \\
- ... \\
- ... \\
- \textbf{POP RBP} \\
- \textbf{RET} \\
- \subsection*{Pasaje de parametros}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item Si es entero o puntero se pasan respetando el orden usando:
- \begin{itemize}
- \setlength\itemsep{1em}
- \item [$*$] RDI, RSI, RDX, RCX, R8 y R9
- \end{itemize}
- \item Si es de tipo flotante se pasan en los XMMs
- \end{itemize}
- Si no hay m\'as registros disponibles de usa la pila, pero deber\'an quedar ordenados desde la direcci\'on m\'as baja a la m\'as alta (se pushean de derecha a izquierda)
- \subsection*{Vectores}
- \textit {"Puntero al inicio del arreglo"} + \textit {"tama\~no del dato"} * \textit {" índice del elemento"}
- \subsection*{Matrices}
- \textit {"Puntero al inicio de la matriz"}
- + \textit {"cantidad elementos de la fila"} * \textit {"indice de la fila"} * \textit {"tama\~no dato"}
- + \textit {"indice de columna"} * \textit {"tama\~no dato"}
- \subsection*{El formato general para direccionar es}
- \begin{center}[ \textit{\textbf{Base}} + \textit{\textbf{Indice}} * \textit{\textbf{scala}} +/- \textit{\textbf{Desplazamiento}} ]\\
- \textbf{Base} = alg\'un registro\\
- \textbf{Indice} = alg\'un registro\\
- \textbf{scala} = 1, 2, 4 u 8\\
- \textbf{Desplazamiento} = inmediato de 32 bits\\
- \end{center}
-
- \section{Alineaci\'on}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf{Alineaci\'on en los campos del struct}:
- Cada campo esta alineado a su tama\~no dentro del struct
- \item \textbf{Alineaci\'on del struct}:
- Se alinea al tama\~no del campo mas grande del struct
- \item\textbf{\_\_atribute\_\_((packed)}:
- Indica que el struct no va a ser alineado
- \end{itemize}
- ------------------------------------------ \\
- \section{SSE}
- Para enteros: Comienzan con P, luego el nombre de la \textit {"operaci\'on"} y terminan con el \textit {"tamaño"} del dato
- \textit {\textbf {Ejemplo}}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf {PADDB}: suma de a \textbf{B}yte
- \item \textbf {PADDW}: suma de a \textbf{W}ord
- \item \textbf {PADDD}: suma de a \textbf{D}oubleword
- \item \textbf {PADDQ}: duma de a \textbf{Q}uadword
- \end{itemize}
-
- Para punto flotante: nombre de la \textit {"operaci\'on"}, \textit {"modo"} de operaci\'on y \textit {"tama\~no"} del dato \\
- \textit {\textbf {Ejemplo}}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf {ADDPS}: suma de a \textbf{F}loat
- \item \textbf {ADDPD}: suma de a \textbf{D}ouble
- \end{itemize}
-
- La P proviene de Packed, podria ser S de Scalar
-
- \subsection*{Multiplicar}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf {PMULLW}: multiplica de a word y se queda con la parte baja
- \item \textbf {PMULHW}: multiplica de a word y se queda con la parte alta
- \end{itemize}
- \subsection*{Saturacion}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf {PADDUSB, PSUBUSB}: Suma y resta de enteros byte sin signo con saturaci\'on sin signo
- \item \textbf {PADDSB, PSUBSB}: Suma y resta de enteros byte con signo con saturaci\'on con signo
- \end{itemize}
- \subsection*{Empaquetado/Desempaquetado}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item Desempaquetado: PUNPCK \{L,H\} \{BW,WD,DQ,QDQ\}
- \item Empaquetado: PACK{SS,US}{WB,DW}\\
- SS, US: \textbf{S}igned/\textbf{u}nsigned, con \textbf{s}aturación
- \end{itemize}
- \textit{\textbf{Ejemplo}}\\
- Estos de aca abajo quiero poner con item, pero si no se puede bueno \\
- \textbf{PXOR} XMM7, XMM7 (este fijate si terminan los dos en 7 que por ahi me confundi por si las moscas) \\
- \textbf{MOVDQU} XMM1, XMM0 \\
- \textbf{PUNPCKLBW} XMM0, XMM7 \\
- \textbf{PUNPCKHBW} XMM1, XMM7 \\
- \subsection*{Desempaquetar}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf{PUNPCKLWD}: usa la parte baja de los registros para juntarlos
- \item \textbf{PUNPCKHWD}: usa la parte alta de los registros para juntarlos
- \end{itemize}
- \subsection*{Shuffles}
- Las intrucciones de Shuffles permiten reordenar datos en registros. Sus par\'ametros serán el registro a reordenar y una mascara que indicar\'a como hacerlo
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf{PSHUF\{B,W,D\}}: Shuffle Packed Bytes, Words, Doublewords
- \item \textbf{PSHUF\{H,L\}W}: Shuffle High, low 16bit values
- \item \textbf{SHUFP\{S,D\}}: Shuffle Packed single, Double FP Values
- \end{itemize}
- \textbf{PSHUFHW} xmm1, xmm2/m128, imm8
- \subsection*{Insert/Extract}
- \begin{itemize}
- \setlength\itemsep{1em}
- \item \textbf{INSERTPS}: Insert Packed Single FP Value
- \item \textbf{EXTRACTPS}: Extract Packed Single FP Value
- \item \textbf{PINSR\{B,W,D,Q\}}: Insert Byte, Word, Dword, Qword
- \item \textbf{PEXTR\{B,W,D,Q\}}: Extract Byte, Word, Dword, Qword
- \end{itemize}
- \textbf{INSERTPS} xmm1, xmm2/m32, imm8 \\
- \textbf{EXTRACTPS} reg/m32, xmm2, imm8 \\
- \textbf{PINSRD} xmm1, r/m32, imm8 \\
- \textbf{PEXTRD} r/m32, xmm2, imm8 \\
- \subsection*{Conversiones}
- Las intrucciones de conversi\'on son de la forma: CTV\textbf{XX}2\textbf{YY} \\
- \textit{Donde \textbf{XX} e \textbf{YY} pueden valer:} \\
- \begin{tabular}[l]{ |c|c|c| }
- PS-Packed Single FP & PD-Packed Double FP & PI-Packed Integer \\
- PS-Packed Single FP & PD-Packed Double FP & PI-Packed Integer \\
- & & DQ-Packed Dword \\
- \end{tabular}
- \section{Instruciones}
- \begin{tabular}[l]{ |@l|>{\itshape}^l|^l| }
- \rowstyle{\bfseries}
- Instruccion & Formato & Descripcion \\
- \hline
- \multicolumn{3}{ |c| }{Conversiones} \\
- \hline
- CVTSD2SI & r64/r32, xmm/m64 & Scalar Double FP to Dword Integer \\
- CVTSI2SD & xmm, r/m32/m64 & Dword Integer to Scalar Double FP \\
- CVTDQ2PS & xmm1, xmm2/m128 & Packed Dword Integers to Packed Single FP (4X)\\
- CVTPS2DQ & xmm1, xmm2/m128 & Packed Single FP to Packed Dword Integers (4X)\\
- CVTDQ2PD & xmm1, xmm2/m64 & Packed Dword Integers to Packed Double FP (2X)\\
- CVTPD2DQ & xmm1, xmm2/m128 & Packed Double FP to Packed Dword Integers (2X)\\
- CVTPD2PS & xmm1, xmm2/m128 & Packed Double FP to Packed Single FP (2X)\\
- CVTPS2PD & xmm1, xmm2/m64 & Packed Single FP to Packed Double FP (2X)\\
- CVTSD2SS & xmm1, xmm2/m64 & Scalar Double FP to Scalar Single FP (1X)\\
- CVTSS2SD & xmm1, xmm2/m32 & Scalar Single FP to Scalar Double FP (1X)\\
- CVTTPS2DQ & xmm1, xmm2/m128 & Truncation Packed Single FP to Packed Dword Int. (4X)\\
- CVTTSS2SI & r32, xmm/m32 & Truncation Scalar Single FP to Dword Integer (1X)\\
- CVTTSD2SI & r32, xmm/m64 & Truncation Scalar Double FP to Signed Integer (1X)\\
- CVTSI2SS & xmm, r/m32 & Dword Integer to Scalar Single FP\\
- CVTSS2SI & r32, xmm/m32 & Scalar Single FP to Dword Integer\\
- CVTPI2PS & xmm, mm/m64 & Packed Dword Integers to Packed Single FP\\
- CVTPI2PD & xmm, mm/m64 & Packed Dword Integers to Packed Double FP\\
- \hline
- \multicolumn{3}{ |c| }{Round} \\
- \hline
- ROUNDPS & xmm1, xmm2/m128, imm8 & Round Packed Single FP to Integer\\
- ROUNDSS & xmm1, xmm2/m32, imm8 & Round Scalar Single FP to Integer\\
- ROUNDPD & xmm1, xmm2/m128, imm8 & Round Packed Double FP to Integer\\
- ROUNDSD & xmm1, xmm2/m64, imm8 & Round Scalar Double FP to Integer\\
- \hline
- \multicolumn{3}{ |c| }{Otros} \\
- \hline
- PCMPGTW & xmm, xmm & Compara word a word y si cumple la condici\'on setea unos en el resultado, sino ceros \\
- \end{tabular}
- \end{document}
|