machete.tex 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. \documentclass[a4paper,]{article}
  2. \usepackage{lmodern}
  3. \usepackage[T1]{fontenc}
  4. \usepackage[a4paper,left=1cm,right=1cm,top=1cm,bottom=1cm]{geometry}
  5. \usepackage{array}
  6. \usepackage{listings} % Para insertar codigo
  7. \usepackage[usenames,dvipsnames]{color} % Colores custom
  8. \usepackage{pbox}
  9. \newcolumntype{@}{>{\global\let\currentrowstyle\relax}}
  10. \newcolumntype{^}{>{\currentrowstyle}}
  11. \newcommand{\rowstyle}[1]{\gdef\currentrowstyle{#1}%
  12. #1\ignorespaces
  13. }
  14. % Configuración de parrafos
  15. \setlength{\parskip}{1em}
  16. % Margenes
  17. \geometry{
  18. a4paper,
  19. total={210mm,297mm},
  20. left=15mm,
  21. right=10mm,
  22. top=15mm,
  23. bottom=10mm,
  24. includehead, includefoot
  25. }
  26. \textwidth=6in
  27. \textheight=9.0in
  28. \renewcommand{\lstlistingname}{C\'odigo}
  29. \definecolor{DarkGreen}{rgb}{0.0,0.4,0.0} % Comentarios
  30. % Lenguajes soportados: ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/listings/listings.pdf
  31. \lstloadlanguages{[x86masm]Assembler, C}
  32. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  33. % Me robe lo de abajo de otro ejemplo, estaba basado en Perl, ver si hay que cambiar algo
  34. \lstdefinestyle{asmStyle}{language=[x86masm]Assembler,
  35. frame=single,
  36. breaklines=true, % Saltar de linea si supero el maximo
  37. basicstyle=\small\ttfamily,
  38. keywordstyle=[1]\color{Blue}\bf, % Color de las funciones de assembler
  39. keywordstyle=[2]\color{Purple}, % Color de parámetros especiales (registros, etc)
  40. identifierstyle=,
  41. commentstyle=\usefont{T1}{pcr}{m}{sl}\color{DarkGreen}\small,
  42. stringstyle=\color{Purple}, % Strings purpuras
  43. showstringspaces=false,
  44. tabsize=4,
  45. %
  46. % Instrucciones no incluidas en el paquete Assembler
  47. 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},
  48. %
  49. % Registros y esas otras cosas especiales que no son instrucciones
  50. 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
  51. xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15,r8b, r9b, r10b, r11b, r8d, r9d, r10d, r11d},
  52. morecomment=[l][\color{Blue}]{...}, % Line continuation (...) like blue comment
  53. numbers=left, % Numeros de linea en la izquiera
  54. firstnumber=1, % Se arranca en la linea 1
  55. numberstyle=\tiny\color{Blue}, % Numeros de linea en azul y chicos
  56. stepnumber=5, % Los numerros de linea se muestran cada 5
  57. numbers=left % where to put the line-numbers; possible values are (none, left, right)
  58. }
  59. \begin{document}
  60. \section{Saltos}
  61. \textbf {JA} = Above/not below or equal | (CF or ZF) = 0 \\
  62. \textbf {JAE} = Above or equal/not below | CF = 0 \\
  63. \textbf {JE} = Equal/zero | ZF = 1 \\
  64. \textbf {JZ} = Equal/zero | ZF = 1 \\
  65. \textbf {JGE} = Greater or equal/not less | (SF xor OF) = 0 \\
  66. \textbf {JG} = Greater/not less or equal | ((SF xor OF) or ZF) = 0 \\
  67. \textbf {JO} = Overflow | OF = 1 \\
  68. \textbf {JECXZ} = Register ECX is zero | ECX = 0 \\
  69. \section{Registros}
  70. \begin{itemize}
  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{tabular}[l]{ |@l|>{\itshape}^l|^p{10cm}| }
  219. \hline
  220. \rowstyle{\bfseries}
  221. Instruccion & Formato & Descripcion \\
  222. \hline
  223. PSHUFB & xmm1, xmm2/m128 & Shuffle bytes in xmm1 according to contents of xmm2/m128. Each byte in the shuffle control mask forms an index to permute the corresponding byte in the destination operand. \\ \hline
  224. PSHUFD & xmm1, xmm2/m128, imm8 & Shuffle the doublewords in xmm2/m128 based on the encoding in imm8 and store the result in xmm1. \pbox{10cm}{
  225. //0x00 set all elems to 1st elem, 0000 0000. \\ //0x55 set all elems to 2nd elem, 0101 0101 \\ //0xAA set all elems to 3rd elem, 1010 1010 \\ //0xFF set all elems to 4th elem, 1111 1111 \\ //0x1B reverse order, 0001 1011} \\ \hline
  226. PSHUF\{H,L\}W & xmm1, xmm2/m128, imm8 & Shuffle the high words in xmm2/m128 based on the encoding in imm8 and store the result in xmm1. \\ \hline
  227. PSIGN\{B,W,D\} & PSIGNB xmm1, xmm2/m128 & Negate/zero/preserve packed byte integers in xmm1 depending on the corresponding sign in xmm2/m128. \\ \hline
  228. \end{tabular}
  229. \subsection*{Insert/Extract}
  230. \begin{tabular}[l]{ |@l|>{\itshape}^l|^p{10cm}| }
  231. \hline
  232. \rowstyle{\bfseries}
  233. Instruccion & Formato & Descripcion \\
  234. \hline
  235. 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
  236. EXTRACTPS & reg/m32, xmm2, imm & Extract Packed Single FP Value. imm8=2bits. DST[31:0] <- (SRC[127:0] >> (SRC\_OFFSET*32)) AND 0FFFFFFFFh \\ \hline
  237. 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
  238. 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
  239. \end{tabular}
  240. \section{Ejercicios}
  241. \subsection{filtrarLista}
  242. \begin{lstlisting}[frame=single, style=asmStyle]
  243. %define NODO_SIZE 16
  244. %define OFFSET_SIGUIENTE 0
  245. %define OFFSET_NOMBRE 8
  246. %define FALSE 0
  247. %define TRUE 1
  248. ;void filtrarBajaLista( nodo** n, bool(*f)(char*,char*), char* nombreCmp )
  249. filtrarBajaLista:
  250. mov r15, rdi ; R15 = nodo** n
  251. mov r14, rsi ; R14 = *f
  252. mov r13, rdx ; R13 = char* nombreCmp
  253. cmp r15, NULL ; por si el ** en NULL
  254. je .fin
  255. .ciclo:
  256. mov rbx, [r15 + OFFSET_SIGUIENTE] ; R15 = **n; RBX = *n
  257. cmp rbx, NULL
  258. je .fin
  259. mov rdi, [rbx + OFFSET_NOMBRE] ; RDI = char* nombre
  260. mov rsi, r13 ; RSI = char* nombreCmp
  261. call r14 ; f( nombre, nombreCmp )
  262. cmp al, TRUE ; if(f(n->nombre, nombreCmp))
  263. je .siguiente
  264. tengoQueBorrrar:
  265. mov rdi, rbx ; NODO A BORRAR
  266. mov rbx, [rbx + OFFSET_SIGUIENTE] ; reenlazo punteros
  267. mov [r15], rbx ; reenlazo punteros
  268. call nodoBorrar ; nodoBorrar( nodo *n )
  269. jmp .ciclo
  270. .siguiente:
  271. mov r15, [r15 + OFFSET_SIGUIENTE] ; avanzo a siguiente
  272. jmp .ciclo
  273. \end{lstlisting}
  274. \subsection{SSE Matriz Negativo}
  275. 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!)
  276. \begin{lstlisting}[frame=single, style=asmStyle]
  277. .ciclo:
  278. movdqu xmm0, [rdi] ; XMM0 = 16 chars
  279. ;(!) pude acceder a 16 elementos de M de una vez...
  280. movdqu xmm1, xmm0 ; XMM1 = XMM0 = 16 chars
  281. movdqu xmm5, xmm0 ; XMM5 = XMM0 = 16 chars
  282. pxor xmm2, xmm2 ; XMM2 = | 0x00 | 0x00 | ... | 0x00 |
  283. pcmpeqb xmm7, xmm7 ; XMM7 = | 0xFF | 0xFF | ... | 0xFF |
  284. ; mascaras para positivos y para negativos
  285. pcmpgtb xmm1, xmm2 ; XMM1 (bytes) = 0x00 si el char es NEGATIVO
  286. ; 0xFF si es POSITIVO
  287. movdqu xmm6, xmm1
  288. pxor xmm6, xmm7 ; XMM6 (bytes) = 0xFF si el char es NEGATIVO
  289. ; 0x00 si es POSITIVO (XMM6 = NOT XMM1
  290. ; separo positivos y negativos
  291. pand xmm0, xmm1 ; XMM0 (bytes) = 0x00 si el char es NEGATIVO
  292. ; el VALOR del char si es POSITIVO
  293. pand xmm5, xmm6 ; XMM5 (bytes) = 0x00 si el char es POSITIVO
  294. ; el VALOR del char si es NEGATIVO
  295. ;(!) pude separar positivos y negativos de a 16 elementos simultaneamente...
  296. ;--------------------------
  297. ; calculo sumPositiva
  298. ; como son postitivos desempaqueto (extiendo signo) con XMM2 que tiene todos ceros
  299. mov xmm3, xmm0
  300. mov xmm4, xmm0
  301. punpcklbw xmm3, xmm2 ; XMM3 (words) = | c7 | c6 | ... | c0 |
  302. punpcklbw xmm4, xmm2 ; XMM4 (words) = | c15 | c14 | ... | c8 |
  303. paddw xmm3, xmm4 ; XMM3 (words) = | c15 + c7 | ... | c8 + c0 |
  304. ;(!) al tener que desempaquetar de byte a word, me quedan 8 por registro
  305. ;(!) entonces, sumo los positivos de a 8 elementos simultaneamente...
  306. ; calculo sumNegativa
  307. ; como son negativos desempaqueto (extiendo signo)
  308. ; con XMM6 que tiene todos 1s donde hay negativos y ceros donde no...
  309. mov xmm8, xmm5
  310. mov xmm9, xmm5
  311. punpcklbw xmm8, xmm6 ; XMM8 (words) = | c7 | c6 | ... | c0 |
  312. punpcklbw xmm9, xmm6 ; XMM9 (words) = | c15 | c14 | ... | c8 |
  313. paddw xmm8, xmm9 ; XMM8 (words) = | c15 + c7 | ... | c8 + c0 |
  314. ;(!) al tener que desempaquetar de byte a word, me quedan 8 por registro
  315. ;(!) entonces, sumo los negativos de a 8 elementos simultaneamente...
  316. ;-------------------------
  317. paddw xmm10, xmm3 ; acumulo positivos
  318. paddw xmm11, xmm8 ; acumulo negativos
  319. add rdi, 16 ; incremento puntero
  320. loop .ciclo
  321. ;(!) pude procesar los 16 elementos de M en un ciclo...
  322. \end{lstlisting}
  323. \subsection{Pila Magica}
  324. Algunas ideas:
  325. \begin{itemize}
  326. \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".
  327. \item Pusheo primero en la pila el 0 (null) para indicar el fin del vector.
  328. \item Los punteros a los short est\'an en "\&(numero->n)", eso lo tengo que meter en la pila.
  329. \item El fin del ciclo puede ser: Comparando el primer puntero (me lo guarde al principio) o contando cantidad de elementos.
  330. \item El tope de la pila es el primer elemento del vector y sirve como \emph{unsigned short* numeros[]} para par\'ametro.
  331. \item Dejar la pila en estado consistente
  332. \end{itemize}
  333. \begin{lstlisting}[frame=single, style=asmStyle]
  334. ahiVaElVector:
  335. push rbp
  336. mov rbp, rsp
  337. push r15
  338. mov rdx, [rdi + OFFSET_SIGUIENTE] ; asumo la lista no esta vacia
  339. mov r15, [rsp] ;guardo mi inicio de memoria
  340. xor rcx,rcx
  341. .cicloAdelante:
  342. inc rcx ;dejo rcx aca porque hace un loop y
  343. ;sino deberia hacer cmp por null en el prox ciclo
  344. cmp rdx, NULL
  345. je .cicloAtras
  346. mov rdi, rdx
  347. mov rdx, [rdx + OFFSET_SIGUIENTE]
  348. jmp .cicloAdelante
  349. push NULL ; pongo el NULL
  350. .cicloAtras:
  351. lea rdx, [rdi + OFFSET_N] ; RDX = &(numero->n)
  352. push rdx
  353. mov rdi, [rdi + OFFSET_ANTERIOR]
  354. loop .cicloAtras
  355. mov rdi, rsp ;aca apunta mi "primer" elem.
  356. ;alineo la pila con matemagicas
  357. and rsp, 0xffffffffffffffffff0 ;son 15 F's. 15x4=60 bits
  358. call dameVector
  359. mov rsp, r15 ;aca tenia mi rsp despues de los push
  360. pop r15
  361. pop rbp
  362. ret
  363. \end{lstlisting}
  364. \end{document}