how to combine or manipulate to registers at same time

Discussion in 'Programmer's Corner' started by cheypr, Dec 2, 2011.

  1. cheypr

    Thread Starter Active Member

    Oct 13, 2009
    34
    0
    Hi, in trying multiplicate in decimal 300 x 300 an then print the result on screen. first two multiplications worked well but I'm stuck in the last one because the result of the multiplication is stored at AX and DX. Is there anything i can do to manipulate those two registers as if it was one in order to be able to convert that hex result in decimal usind the DecimalToString proc in the code?

    This code is for 8086 and I'm using emu8086 to run the code.

    here is a picture that highlights the hex values in ax and dx that i need to change hex to dec.

    here is the code
    Code ( (Unknown Language)):
    1.  
    2. ;multiplicacion
    3.  
    4. org 100h
    5.  
    6. .model small
    7.  
    8. .stack 100h
    9. CR equ 13d
    10. LF equ 10d  
    11.  
    12. .data
    13. mult1 db "byte1 * byte2= (5*10)= $"
    14. mult2 db CR, LF, "byte1 * word1= (350*10)= $"
    15. mult3 db CR, LF, "word1 * word2= (300*300)= $"
    16.  
    17. .code
    18.  
    19. start:
    20. mov ax, @data
    21. mov ds, ax
    22. mov dx, offset mult1    
    23. call puts               ; llama subprograma llamado puts
    24. ;---- byte * byte -----
    25. mov bl, 5
    26. mov cl, 10
    27. mov al, cl
    28. mul bl
    29. call DecimalToString   ;llama el procedimiento que convierte un numero decimal en un string y lo imprime en pantalla
    30.  
    31. ;---- byte * word -----
    32. mov dx, offset mult2    
    33. call puts
    34.  
    35. mov bx, 350
    36. mov cx, 10
    37. mov ax, cx
    38. mul bx
    39. call DecimalToString
    40.  
    41. ;---- word * word -----
    42. mov dx, offset mult3
    43. call puts
    44.  
    45. mov bx, 300
    46. mov cx, 300
    47. mov ax, cx
    48. mul bx
    49. call DecimalToString
    50.  
    51.  
    52. mov ah, 4ch            ;termina el programa int 21h
    53. int 21h
    54.  
    55.  
    56. ;----- hex to dec -----
    57. DecimalToString PROC   ;comienza el procedimiento
    58. push ax                ;salvando ax, bx, cx, dx en el stack
    59. push bx
    60. push cx
    61. push dx
    62. xor cx, cx             ;basicamente hace esto: cx = 00000000
    63. mov bx, 10d            ;pone el decimal 10 en bx
    64. loop1:                
    65. xor dx, dx             ;hace esto: dx = 00000000
    66. div bx                 ;divide ax por bx y pone el resultado en dx
    67. push dx                ;guarda el residuo en el stack
    68. inc cx                 ;cuenta el numero de residuos guardados en el stack
    69. cmp ax, 0              ;divide hasta que ax = 0
    70. jnz loop1              ;loop hasta ax = 0
    71. mov ah, 02             ;parametro para int 21
    72. loop2:                
    73. pop dx                 ;nos da el ultimo valor de dx guardado en el stack
    74. add dl, 48             ;suma 48 porque 48 es el ASCII code de cero (0)
    75. int 21h                ;llama el int 21 para imprimir valor en dx
    76. dec cx                 ;disminuye el conteo de residuos
    77. jnz loop2              
    78. pop dx                 ;devuelve los valores originales en los registros
    79. pop cx
    80. pop bx
    81. pop ax
    82. ret                    
    83. DecimalToString ENDP   ;termina el procedimiento
    84. ret
    85.  
    86. mov ax, 4c00h
    87. int 21h                 ; return to ms-dos
    88.  
    89. ; user defined subprograms
    90. puts:                   ; display a string terminated by $
    91. mov ah, 9h
    92. int 21h                
    93. ret
    94. putc:                   ; display character in dl
    95. mov ah, 2h
    96. int 21h
    97. ret
    98.  
     
Loading...