Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Binary_Death en 28 Noviembre 2010, 19:23 pm



Título: [NASM] String Reverse =P
Publicado por: Binary_Death en 28 Noviembre 2010, 19:23 pm
Mi segundo programa. Mi segundo día de estudio de asm  :P
Imagino que usé el método más espantoso para hacerlo... pero bueno, no se casi nada y es sólo mi segundo code de práctica... así que xD

Código
  1. ;;;;;;;;;;;;;;;;;
  2. ;String Reverse ;
  3. ;By Binary_Death;
  4. ;;;;;;;;;;;;;;;;;
  5. segment Data
  6. msg1 db 'Cadena a invertir: $'
  7. msg2 db 'Cadena invertida: $'
  8. string times 256 db ' '
  9. char db ' $'
  10. clf db 10,13,10,13,'$'
  11. segment Stack stack
  12. resb 256
  13. StackEnd:
  14. segment Code
  15. ..start:
  16. mov ax, Stack
  17. mov ss, ax
  18. mov sp, StackEnd
  19. mov ax, Data
  20. mov ds, ax
  21. mov ah,9h
  22. mov dx,msg1
  23. int 21h
  24. xor bx,bx
  25. SaveStr:
  26. xor ah,ah
  27. int 16h
  28. cmp al,0Dh
  29. je ShowStr
  30. mov [string+bx],al
  31. mov [char],al
  32. mov dx,char
  33. mov ah,9
  34. int 21h
  35. cmp bx,00FFh
  36. je ShowStr
  37. inc bx
  38. jmp SaveStr
  39. ShowStr:
  40. mov ah,9h
  41. mov dx,clf
  42. int 21h
  43. mov dx,msg2
  44. int 21h
  45. dec bx
  46. LoopPos:
  47. mov al,[string+bx]
  48. mov [char],al
  49. mov ah,9h
  50. mov dx,char
  51. int 21h
  52. cmp bx,00h
  53. je Exit
  54. dec bx
  55. jmp LoopPos
  56. Exit:
  57. xor ah,ah
  58. int 16h
  59. mov ah,4ch
  60. int 21h
  61.  

Agradecería que se me comentara cómo mejorar.

Saludos!

EDITO:

Bueno, en el tercer día de aprendizaje aprendí unas cuantas nuevas cosas. Así que mejoré esto...

Código
  1. ;;;;;;;;;;;;;;;;;
  2. ;;StrRev 16 bit;;
  3. ;;    NASM     ;;
  4. ;;Binary_Death ;;
  5. ;;;;;;;;;;;;;;;;;
  6. segment data
  7. MSG1 DB 'Cadena a Invertir: $'
  8. MSG2 DB 'Cadena Invertida: $'
  9. CRNL DB 10,13,'$'
  10. BKSC DB 8,'$'
  11. CHR1 DB ' $'
  12. segment stck stack
  13. resb 256
  14. SpOffset:
  15.  
  16. segment code
  17. ..start:
  18.  
  19. ;Asumimos segmentos
  20. mov ax,data
  21. mov ds,ax ;DS=Data
  22. mov es,ax ;ES=Data
  23.  
  24. mov ax,stck
  25. mov ss,ax ;SS=Stck
  26. mov sp,SpOffset ;SP=Offset(SpOffset)
  27.  
  28. mov ah,9h
  29. mov dx,MSG1
  30. int 21h ;Mostramos MSG1 en pantalla
  31.  
  32. mov dx,0FFh
  33. xor cx,cx
  34. PushLoop:
  35. xor ah,ah
  36. int 16h ;Pedimos carácter por teclado
  37. cmp al,9h ;Si CHR=BS
  38. jz BackSpace ;jmp BackSpace
  39. cmp al,0Dh ;Si chr=\CR
  40. jz ShowStr ;jmp ShowStr
  41. push ax ;Empujamos AH+AL(=00+Chr) a stack
  42. mov [CHR1],al ;Guardamos carácter en memoria
  43. mov ah,9h
  44. mov dx,CHR1
  45. int 21h ;Mostramos el carácter guardado
  46. inc cx ;Incrementamos CX
  47. dec dx ;Decrementamos DX
  48. jnz PushLoop ;Si CX!=0 jmp PushLoop
  49.  
  50. ShowStr:
  51. mov ah,9h
  52. mov dx,CRNL ;Salto de línea
  53. int 21h ;Efectuamos
  54.  
  55. PopLoop:
  56. pop ax ;Recuperamos último CHR
  57. mov [CHR1],al ;Lo guardamos en CHR1
  58. mov ah,9h
  59. mov dx,CHR1
  60. int 21h ;Lo mostramos en pantalla
  61. loop PopLoop ;Si CX!=0 jmp PopLoop
  62.  
  63. Exit:
  64. xor ah,ah
  65. int 16h ;Hacemos pausa
  66. mov ah,4ch
  67. int 21h ;Devolvemos control al OS
  68.  
  69. BackSpace:
  70. mov ah,9h
  71. mov dx,BKSC
  72. int 21h
  73. jmp PushLoop
  74.