machete.tex 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. \documentclass{article}
  2. \usepackage{lmodern}
  3. \usepackage[T1]{fontenc}
  4. \usepackage{geometry}
  5. \usepackage{array}
  6. \usepackage{listings} % Para insertar codigo
  7. \usepackage[usenames,dvipsnames]{color} % Colores custom
  8. \newcolumntype{@}{>{\global\let\currentrowstyle\relax}}
  9. \newcolumntype{^}{>{\currentrowstyle}}
  10. \newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
  11. #1\ignorespaces
  12. }
  13. % Configuración de parrafos
  14. \setlength{\parskip}{1em}
  15. % Margenes
  16. \geometry{
  17. a4paper,
  18. total={210mm,297mm},
  19. left=15mm,
  20. right=10mm,
  21. top=15mm,
  22. bottom=10mm,
  23. includehead, includefoot
  24. }
  25. \textwidth=6in
  26. \textheight=9.0in
  27. \renewcommand{\lstlistingname}{C\'odigo}
  28. \definecolor{DarkGreen}{rgb}{0.0,0.4,0.0} % Comentarios
  29. % Lenguajes soportados: ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/listings/listings.pdf
  30. \lstloadlanguages{[x86masm]Assembler, C}
  31. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  32. % Me robe lo de abajo de otro ejemplo, estaba basado en Perl, ver si hay que cambiar algo
  33. \lstdefinestyle{asmStyle}{language=[x86masm]Assembler,
  34. frame=single,
  35. breaklines=true, % Saltar de linea si supero el maximo
  36. basicstyle=\small\ttfamily,
  37. keywordstyle=[1]\color{Blue}\bf, % Color de las funciones de assembler
  38. keywordstyle=[2]\color{Purple}, % Color de parámetros especiales (registros, etc)
  39. identifierstyle=,
  40. commentstyle=\usefont{T1}{pcr}{m}{sl}\color{DarkGreen}\small,
  41. stringstyle=\color{Purple}, % Strings purpuras
  42. showstringspaces=false,
  43. tabsize=4,
  44. %
  45. % Instrucciones no incluidas en el paquete Assembler
  46. morekeywords={global, define, section, .rodata, .text, jl, movd, movdqu, mulss, subss, addss, cmpss, pand, cvtss2si, cvttss2si, cvtsi2ss, pxor, pslldq, movq, pshufb, paddb, pmaxub, punpcklbw, punpckhbw},
  47. %
  48. % Registros y esas otras cosas especiales que no son instrucciones
  49. morekeywords=[2]{rax,al,rdx,rcx,rbx,rsi,rdi,rsp,rbp,r8,r9,r10,r11,r12,r13,r14,r15,xmm0,xmm1,xmm2,xmm3,xmm4,xmm5,xmm6,xmm7
  50. xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15,r8b, r9b, r10b, r11b, r8d, r9d, r10d, r11d},
  51. morecomment=[l][\color{Blue}]{...}, % Line continuation (...) like blue comment
  52. numbers=left, % Numeros de linea en la izquiera
  53. firstnumber=1, % Se arranca en la linea 1
  54. numberstyle=\tiny\color{Blue}, % Numeros de linea en azul y chicos
  55. stepnumber=5, % Los numerros de linea se muestran cada 5
  56. numbers=left % where to put the line-numbers; possible values are (none, left, right)
  57. }
  58. \begin{document}
  59. \section{Saltos}
  60. \textbf {JA} = Above/not below or equal | (CF or ZF) = 0 \\
  61. \textbf {JAE} = Above or equal/not below | CF = 0 \\
  62. \textbf {JE} = Equal/zero | ZF = 1 \\
  63. \textbf {JZ} = Equal/zero | ZF = 1 \\
  64. \textbf {JGE} = Greater or equal/not less | (SF xor OF) = 0 \\
  65. \textbf {JG} = Greater/not less or equal | ((SF xor OF) or ZF) = 0 \\
  66. \textbf {JO} = Overflow | OF = 1 \\
  67. \textbf {JECXZ} = Register ECX is zero | ECX = 0 \\
  68. \section{Registros}
  69. \begin{itemize}
  70. \setlength\itemsep{1em}
  71. \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
  72. \item \textbf{32 bits}: EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP, R8D, R9D, R10D, R11D, R12D, R13D, R14D, R15D
  73. \item \textbf{64 bits}: RAX, RBX, RCX, RDX, RSI, RDI, RPB, RSP, R8, R9, R10, R11, R12, R13, R14, R15
  74. \item \textbf{128 bits}: XMM0-XMM15
  75. \end{itemize}
  76. \section{Secciones y Etiquetas}
  77. \subsection*{Secciones}
  78. \textbf{.data}: Variables \\
  79. \textbf{.rodata}: Constantes \\
  80. \textbf{.text}: C\'odigo \\
  81. %\subsection*{Etiquetas}
  82. %\textbf{global}: Define un s\'imbolo que va a ser visto externamente \\
  83. %\textbf{\_start}: Punto de entrada de un programa en linux \\
  84. %\textbf{extern}: Llamar funci\'on externa
  85. %\subsection*{Pseudoinstrucciones}
  86. %Prefijo \textbf{TIMES}, para repetir una cantidad de veces la instrucci\'on que sigue
  87. \section*{Instrucciones}
  88. \begin{tabular}[l]{ |@l|>{\itshape}^l|^p{10cm}| }
  89. \hline
  90. \rowstyle{\bfseries}
  91. Instruccion & Formato & Descripcion \\
  92. \hline
  93. DB, DW, DD, DQ & -- & Definir datos \\ \hline
  94. SHR & reg, imm & Hace un shift right l\'ogico (sin signo) \\ \hline
  95. SAR & reg, imm & Hace un shift right aritm\'etico (con signo) \\ \hline
  96. LEA & reg1, [ reg * imm + imm/reg ] & Evalua lo que hay entre corchetes y lo almacena en reg1 \\ \hline
  97. MOVZX & reg, reg/mem & Copia y extiene con cero. Solo vale para (b->w, d->dw, w->dw) \\ \hline
  98. CBW & reg, reg & Extiende w->dw o b->w. Extiende signo \\ \hline
  99. MOV & (tam), mem/imm & Para el caso de inmediato o mem, especificar tam \\ \hline
  100. CMP & (tam), mem/imm & Para el caso de inmediato o mem, especificar tam \\ \hline
  101. MOVQ & xmm, reg & Muevo de registro a registro XMM \\ \hline
  102. REP & instruccion & Repito RCX veces la instrucci\'on siguiente \\ \hline
  103. CLD/STD & -- & Limpio(DF=0)/Seteo(DF=1) flag de direcci\'on \\ \hline
  104. MOVSB/W/D/DQ & -- & Mueve el contenido de donde apunta RSI y lo almacena a donde apunta RDI, despues si DF=0 incrementa, sino decrementa segun tam. \\
  105. CMPSB/W/D/DQ & -- & Compara el contenido de donde apunta RSI y donde apunta RDI. Modifica flags. Despues si DF=0 incrementa, sino decrementa. \\
  106. \hline
  107. \end{tabular}
  108. \section{Convenci\'on C}
  109. %\begin{itemize}
  110. %\setlength\itemsep{1em}
  111. %\item RBX, R12, R13, R14 y R15 \\
  112. %\item Retornar el resultado RAX o XMM0 \\
  113. %\item No romper la pila \\
  114. %\item Antes de llamar, alinear la pila a 16 bytes \\
  115. %\end{itemize}
  116. \subsection*{Stack Frame}
  117. \textbf{PUSH RBP} \\
  118. \textbf{MOV RBP, RSP} \\
  119. ... \\
  120. \textbf{SUB RSP, 8}; para alinear, variables locales \\
  121. \textbf{SUB RSP, 16}; Para almacenar registros XMM \\
  122. ;sub rsp, 16 ;por ejemplo \\
  123. ;mov [rsp], xmm0 ; esto es equiv a "push xmm0" \\
  124. \textbf{POP RBP} \\
  125. \textbf{RET} \\
  126. \emph{El \textbf{RSP} apunta al \'ultimo elemento pusheado. Hacer push decrementa el RSP en 8 y mueve el dato.}
  127. \subsection*{Pasaje de parametros}
  128. \begin{itemize}
  129. \setlength\itemsep{1em}
  130. \item Si es entero o puntero se pasan respetando el orden usando:
  131. \begin{itemize}
  132. \setlength\itemsep{1em}
  133. \item [$*$] RDI, RSI, RDX, RCX, R8 y R9
  134. \end{itemize}
  135. \item Si es de tipo flotante se pasan en los XMMs
  136. \end{itemize}
  137. 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)
  138. \subsection*{Vectores}
  139. \textit {"Puntero al inicio del arreglo"} + \textit {"tama\~no del dato"} * \textit {" \'indice del elemento"}
  140. \subsection*{Matrices}
  141. \textit {"Puntero al inicio de la matriz"}
  142. + \textit {"cantidad elementos de la fila"} * \textit {"indice de la fila"} * \textit {"tama\~no dato"}
  143. + \textit {"indice de columna"} * \textit {"tama\~no dato"}
  144. \subsection*{El formato general para direccionar es}
  145. \begin{center}[ \textit{\textbf{Base}} + \textit{\textbf{Indice}} * \textit{\textbf{scala}} +/- \textit{\textbf{Desplazamiento}} ]\\
  146. \textbf{Base} = alg\'un registro\\
  147. \textbf{Indice} = alg\'un registro\\
  148. \textbf{scala} = 1, 2, 4 u 8\\
  149. \textbf{Desplazamiento} = inmediato de 32 bits\\
  150. \end{center}
  151. \section{Alineaci\'on}
  152. \begin{itemize}
  153. \item \textbf{Alineaci\'on en los campos del struct}:
  154. Cada campo esta alineado a su tama\~no dentro del struct
  155. \item \textbf{Alineaci\'on del struct}:
  156. Se alinea al tama\~no del campo mas grande del struct
  157. \item\textbf{\_\_atribute\_\_((packed)}:
  158. Indica que el struct no va a ser alineado
  159. \end{itemize}
  160. ------------------------------------------ \\
  161. \section{SSE}
  162. %Para enteros: Comienzan con P, luego el nombre de la \textit {"operaci\'on"} y terminan con el \textit {"tamaño"} del dato
  163. %
  164. %\textit {\textbf {Ejemplo}}
  165. %\begin{itemize}
  166. %\setlength\itemsep{1em}
  167. % \item \textbf {PADDB}: suma de a \textbf{B}yte
  168. % \item \textbf {PADDW}: suma de a \textbf{W}ord
  169. % \item \textbf {PADDD}: suma de a \textbf{D}oubleword
  170. % \item \textbf {PADDQ}: duma de a \textbf{Q}uadword
  171. %\end{itemize}
  172. %Para punto flotante: nombre de la \textit {"operaci\'on"}, \textit {"modo"} de operaci\'on y \textit {"tama\~no"} del dato \\
  173. %\textit {\textbf {Ejemplo}}
  174. % \begin{itemize}
  175. % \setlength\itemsep{1em}
  176. % \item \textbf {ADDPS}: suma de a \textbf{F}loat
  177. % \item \textbf {ADDPD}: suma de a \textbf{D}ouble
  178. % \end{itemize}
  179. %
  180. %La P proviene de Packed, podria ser S de Scalar
  181. %
  182. %\subsection*{Multiplicar}
  183. %\begin{itemize}
  184. %\setlength\itemsep{1em}
  185. %\item \textbf {PMULLW}: multiplica de a word y se queda con la parte baja
  186. %\item \textbf {PMULHW}: multiplica de a word y se queda con la parte alta
  187. %\end{itemize}
  188. %
  189. %\subsection*{Saturacion}
  190. %\begin{itemize}
  191. %\setlength\itemsep{1em}
  192. %\item \textbf {PADDUSB, PSUBUSB}: Suma y resta de enteros byte sin signo con saturaci\'on sin signo
  193. %\item \textbf {PADDSB, PSUBSB}: Suma y resta de enteros byte con signo con saturaci\'on con signo
  194. %\end{itemize}
  195. %
  196. %\subsection*{Empaquetado/Desempaquetado}
  197. %\begin{itemize}
  198. %\setlength\itemsep{1em}
  199. %\item Desempaquetado: PUNPCK \{L,H\} \{BW,WD,DQ,QDQ\}
  200. %\item Empaquetado: PACK{SS,US}{WB,DW}\\
  201. % SS, US: \textbf{S}igned/\textbf{u}nsigned, con \textbf{s}aturación
  202. %\end{itemize}
  203. %\textit{\textbf{Ejemplo}}\\
  204. %Estos de aca abajo quiero poner con item, pero si no se puede bueno \\
  205. %\textbf{PXOR} XMM7, XMM7 (este fijate si terminan los dos en 7 que por ahi me confundi por si las moscas) \\
  206. %\textbf{MOVDQU} XMM1, XMM0 \\
  207. %\textbf{PUNPCKLBW} XMM0, XMM7 \\
  208. %\textbf{PUNPCKHBW} XMM1, XMM7 \\
  209. %
  210. %\subsection*{Desempaquetar}
  211. %\begin{itemize}
  212. %\setlength\itemsep{1em}
  213. %\item \textbf{PUNPCKLWD}: usa la parte baja de los registros para juntarlos
  214. %\item \textbf{PUNPCKHWD}: usa la parte alta de los registros para juntarlos
  215. %\end{itemize}
  216. \subsection*{Shuffles}
  217. Las intrucciones de Shuffles permiten reordenar datos en registros. Sus par\'ametros ser\'an el registro a reordenar y una mascara que indicar\'a como hacerlo
  218. \begin{itemize}
  219. \item \textbf{PSHUF\{B,W,D\}}: Shuffle Packed Bytes, Words, Doublewords
  220. \item \textbf{PSHUF\{H,L\}W}: Shuffle High, low 16bit values
  221. \item \textbf{SHUFP\{S,D\}}: Shuffle Packed single, Double FP Values
  222. \end{itemize}
  223. \textbf{PSHUFHW} xmm1, xmm2/m128, imm8
  224. \subsection*{Insert/Extract}
  225. \begin{tabular}[l]{ |@l|>{\itshape}^l|^p{10cm}| }
  226. \hline
  227. \rowstyle{\bfseries}
  228. Instruccion & Formato & Descripcion \\
  229. \hline
  230. INSERTPS & xmm1, xmm2/m32, imm8 & Scalar Double FP to Dword Integer. Donde imm8 = (S,D,Z) donde S y D son combinaci\'on de 2 bits para decir: Src y Dst. Z = Zmask: 4 bits para decir que singles de Dst quedan con 0. \\ \hline
  231. EXTRACTPS & reg/m32, xmm2, imm & Extract Packed Single FP Value. imm8=2bits. DST[31:0] <- (SRC[127:0] >> (SRC\_OFFSET*32)) AND 0FFFFFFFFh \\ \hline
  232. PINSR\{B,W,D,Q\} & xmm1, r/m32, imm8 & Insert Byte, Word, Dword, Qword integer value from r32,64/m8,32,64 into xmm1 at the destination element in xmm1 specified by imm8 \\ \hline
  233. PEXTR\{B,W,D,Q\ & r/m32, xmm2, imm8 & Extract Byte, Word, Dword, Qword integer value from xmm2 at the source byte, dword, qword, offset specified by imm8 into reg. The upper bits of reg are zeroed. \\ \hline
  234. \end{tabular}
  235. \section{Ejercicios}
  236. \subsection{filtrarLista}
  237. \begin{lstlisting}[frame=single, style=asmStyle]
  238. %define NODO_SIZE 16
  239. %define OFFSET_SIGUIENTE 0
  240. %define OFFSET_NOMBRE 8
  241. %define FALSE 0
  242. %define TRUE 1
  243. ;void filtrarBajaLista( nodo** n, bool(*f)(char*,char*), char* nombreCmp )
  244. filtrarBajaLista:
  245. mov r15, rdi ; R15 = nodo** n
  246. mov r14, rsi ; R14 = *f
  247. mov r13, rdx ; R13 = char* nombreCmp
  248. cmp r15, NULL ; por si el ** en NULL
  249. je .fin
  250. .ciclo:
  251. mov rbx, [r15 + OFFSET_SIGUIENTE] ; R15 = **n; RBX = *n
  252. cmp rbx, NULL
  253. je .fin
  254. mov rdi, [rbx + OFFSET_NOMBRE] ; RDI = char* nombre
  255. mov rsi, r13 ; RSI = char* nombreCmp
  256. call r14 ; f( nombre, nombreCmp )
  257. cmp al, TRUE ; if(f(n->nombre, nombreCmp))
  258. je .siguiente
  259. tengoQueBorrrar:
  260. mov rdi, rbx ; NODO A BORRAR
  261. mov rbx, [rbx + OFFSET_SIGUIENTE] ; reenlazo punteros
  262. mov [r15], rbx ; reenlazo punteros
  263. call nodoBorrar ; nodoBorrar( nodo *n )
  264. jmp .ciclo
  265. .siguiente:
  266. mov r15, [r15 + OFFSET_SIGUIENTE] ; avanzo a siguiente
  267. jmp .ciclo
  268. \end{lstlisting}
  269. \subsection{SSE Matriz Negativo}
  270. Aca lo importante es que al desempaquetar un negativo perdes el bit de signo si lo extendes con ceros. Lo tenes que extender con unos (pero solo para los elementos que sean negativos!)
  271. \begin{lstlisting}[frame=single, style=asmStyle]
  272. .ciclo:
  273. movdqu xmm0, [rdi] ; XMM0 = 16 chars
  274. ;(!) pude acceder a 16 elementos de M de una vez...
  275. movdqu xmm1, xmm0 ; XMM1 = XMM0 = 16 chars
  276. movdqu xmm5, xmm0 ; XMM5 = XMM0 = 16 chars
  277. pxor xmm2, xmm2 ; XMM2 = | 0x00 | 0x00 | ... | 0x00 |
  278. pcmpeqb xmm7, xmm7 ; XMM7 = | 0xFF | 0xFF | ... | 0xFF |
  279. ; mascaras para positivos y para negativos
  280. pcmpgtb xmm1, xmm2 ; XMM1 (bytes) = 0x00 si el char es NEGATIVO
  281. ; 0xFF si es POSITIVO
  282. movdqu xmm6, xmm1
  283. pxor xmm6, xmm7 ; XMM6 (bytes) = 0xFF si el char es NEGATIVO
  284. ; 0x00 si es POSITIVO (XMM6 = NOT XMM1
  285. ; separo positivos y negativos
  286. pand xmm0, xmm1 ; XMM0 (bytes) = 0x00 si el char es NEGATIVO
  287. ; el VALOR del char si es POSITIVO
  288. pand xmm5, xmm6 ; XMM5 (bytes) = 0x00 si el char es POSITIVO
  289. ; el VALOR del char si es NEGATIVO
  290. ;(!) pude separar positivos y negativos de a 16 elementos simultaneamente...
  291. ;--------------------------
  292. ; calculo sumPositiva
  293. ; como son postitivos desempaqueto (extiendo signo) con XMM2 que tiene todos ceros
  294. mov xmm3, xmm0
  295. mov xmm4, xmm0
  296. punpcklbw xmm3, xmm2 ; XMM3 (words) = | c7 | c6 | ... | c0 |
  297. punpcklbw xmm4, xmm2 ; XMM4 (words) = | c15 | c14 | ... | c8 |
  298. paddw xmm3, xmm4 ; XMM3 (words) = | c15 + c7 | ... | c8 + c0 |
  299. ;(!) al tener que desempaquetar de byte a word, me quedan 8 por registro
  300. ;(!) entonces, sumo los positivos de a 8 elementos simultaneamente...
  301. ; calculo sumNegativa
  302. ; como son negativos desempaqueto (extiendo signo)
  303. ; con XMM6 que tiene todos 1s donde hay negativos y ceros donde no...
  304. mov xmm8, xmm5
  305. mov xmm9, xmm5
  306. punpcklbw xmm8, xmm6 ; XMM8 (words) = | c7 | c6 | ... | c0 |
  307. punpcklbw xmm9, xmm6 ; XMM9 (words) = | c15 | c14 | ... | c8 |
  308. paddw xmm8, xmm9 ; XMM8 (words) = | c15 + c7 | ... | c8 + c0 |
  309. ;(!) al tener que desempaquetar de byte a word, me quedan 8 por registro
  310. ;(!) entonces, sumo los negativos de a 8 elementos simultaneamente...
  311. ;-------------------------
  312. paddw xmm10, xmm3 ; acumulo positivos
  313. paddw xmm11, xmm8 ; acumulo negativos
  314. add rdi, 16 ; incremento puntero
  315. loop .ciclo
  316. ;(!) pude procesar los 16 elementos de M en un ciclo...
  317. \end{lstlisting}
  318. \subsection{Pila Magica}
  319. Algunas ideas:
  320. \begin{itemize}
  321. \item Recorro la lista hasta el iltimo elemento para poder leerlos de atras para adelante. Si los apilo en la pila de atras para quedan bien para que los tome como arrat "dameVector".
  322. \item Pusheo primero en la pila el 0 (null) para indicar el fin del vector.
  323. \item Los punteros a los short est\'an en "\&(numero->n)", eso lo tengo que meter en la pila.
  324. \item El fin del ciclo puede ser: Comparando el primer puntero (me lo guarde al principio) o contando cantidad de elementos.
  325. \item El tope de la pila es el primer elemento del vector y sirve como \emph{unsigned short* numeros[]} para par\'ametro.
  326. \item Dejar la pila en estado consistente
  327. \end{itemize}
  328. \begin{lstlisting}[frame=single, style=asmStyle]
  329. ahiVaElVector:
  330. push rbp
  331. mov rbp, rsp
  332. push r15
  333. mov rdx, [rdi + OFFSET_SIGUIENTE] ; asumo la lista no esta vacia
  334. mov r15, [rsp] ;guardo mi inicio de memoria
  335. xor rcx,rcx
  336. .cicloAdelante:
  337. inc rcx ;dejo rcx aca porque hace un loop y
  338. ;sino deberia hacer cmp por null en el prox ciclo
  339. cmp rdx, NULL
  340. je .cicloAtras
  341. mov rdi, rdx
  342. mov rdx, [rdx + OFFSET_SIGUIENTE]
  343. jmp .cicloAdelante
  344. push NULL ; pongo el NULL
  345. .cicloAtras:
  346. lea rdx, [rdi + OFFSET_N] ; RDX = &(numero->n)
  347. push rdx
  348. mov rdi, [rdi + OFFSET_ANTERIOR]
  349. loop .cicloAtras
  350. mov rdi, rsp ;aca apunta mi "primer" elem.
  351. ;alineo la pila con matemagicas
  352. and rsp, 0xffffffffffffffffff0 ;son 15 F's. 15x4=60 bits
  353. call dameVector
  354. mov rsp, r15 ;aca tenia mi rsp despues de los push
  355. pop r15
  356. pop rbp
  357. ret
  358. \end{lstlisting}
  359. \end{document}