SoloCodigo

Programación General => ASM (Ensamblador) => Mensaje iniciado por: xomi en Jueves 15 de Septiembre de 2005, 02:53

Título: Numeros Negativos
Publicado por: xomi en Jueves 15 de Septiembre de 2005, 02:53
hola estoy empezando a programar en ASM, no tengo muchos conocimientos y tengo que entregar un poyecto para el lunes el cual trata de lo siguiente

se tiene un arreglo A con valores positivos y negativos de tipo byte, implemente un programa que apartir de A genere dos Arreglos
B con los valores positivos de A
C con los valores negativos de B
el arreglo A debe ser recorrido via un ciclo con JMP que analice en cada vuelta si el valor debe ir en B o en C lo estoy realizando en MASM32 :(


creo que he podido realizar lo de los positivos pero con los negativos no puedo ojala y me puedan ayudar se los agradeseria

Código: Text
  1.  
  2.  
  3. ;copia de areglos entre a y b
  4.  
  5. .386
  6. .model flat, stdcall
  7. option casemap: none
  8.  
  9. include \masm32\include\windows.inc
  10. include \masm32\macros\macros.asm
  11. include \masm32\include\kernel32.inc
  12. include \masm32\include\masm32.inc
  13. include \masm32\include\user32.inc
  14.  
  15. includelib \masm32\lib\masm32.lib
  16. includelib \masm32\lib\kernel32.lib
  17. includelib \masm32\lib\user32.lib
  18.  
  19. .data
  20. a  sbyte 1,2,3,4,5,6
  21. b  sbyte 0,0,0,0,0,0
  22.  
  23.  
  24. .code
  25.     inicio:
  26.  
  27.         mov eax, 0
  28.         mov ebx, 0
  29.         mov edx, 0
  30.      
  31.  
  32.     ciclo:
  33.  
  34.     push eax
  35.     mov al,a[ebx]  
  36.     mov b[ebx], al  
  37.     invoke StdOut, ustr$(eax)
  38.    print chr$(" A ",13,10)
  39.     pop eax
  40.  
  41.  
  42.    
  43.    push edx
  44.     mov dl, b[ebx]
  45.     invoke StdOut, ustr$(edx)
  46.     print chr$(" B ",13,10)
  47.          
  48.     pop edx
  49.  
  50.     .if ebx < 5  
  51.         .if a[ebx]> 0
  52.         inc ebx
  53.         jmp ciclo
  54.        
  55.         .endif
  56.        
  57.    .endif
  58.     invoke ExitProcess,0
  59.   end inicio
  60.  
  61.  
Título: Re: Numeros Negativos
Publicado por: Eternal Idol en Jueves 15 de Septiembre de 2005, 11:43
Un par de apuntes, estas dependiente mucho tanto de MASM (el ensamblador en si) como de MASM 32 (el paquete), no se si te lo aceptaran.

Ahora el codigo, lo que estas haciendo hasta ahora es recorrer desde 0 a 6 el array y al hacer:

Código: Text
  1.  
  2.   mov b[ebx], al
  3.  
  4.  

Estas llenando b
Código: Text
  1.  
  2.    .if al < 128
  3.      mov b[ebx], al
  4.     ;aca imprimirias NUMERO + B
  5.    .else
  6.     ;aca imprimirias NUMERO + C
  7.      mov carray[ebx], al  
  8.    .endif
  9.  
  10.  

Como nota adicional no podes modificar ebx tan alegremente ya que es utilizado por Windows.

 :smartass:  :devil:  :comp:
Título: Re: Numeros Negativos
Publicado por: xomi en Jueves 15 de Septiembre de 2005, 18:47
Gracias eh podido resolverlo

si quisiera capturar los valores de A desde teclado que tendia que hacer
Código: Text
  1.  
  2. .386
  3. .model flat, stdcall
  4. option casemap: none
  5.  
  6. include \masm32\include\windows.inc
  7. include \masm32\macros\macros.asm
  8. include \masm32\include\kernel32.inc
  9. include \masm32\include\masm32.inc
  10. include \masm32\include\user32.inc
  11.  
  12. includelib \masm32\lib\masm32.lib
  13. includelib \masm32\lib\kernel32.lib
  14. includelib \masm32\lib\user32.lib
  15.  
  16. .data
  17. a  sbyte -1,2,-3,4,5,6&#59;[B]como podria capturar estos valores desde teclado[/B]
  18. b  sbyte 0,0,0,0,0,0
  19. t  sbyte 0,0,0,0,0,0
  20.  
  21.  
  22. .code
  23.     inicio:
  24.  
  25.         mov eax, 0
  26.         mov ebx, 0
  27.        
  28.     ciclo:  
  29.     .if ebx < 6
  30.         mov al,a[ebx]
  31.          .if a[ebx] > 0
  32.             mov b[ebx],al            
  33.           .endif
  34.           .if a[ebx] < 0
  35.             mov t[ebx],al            
  36.           .endif
  37.  
  38.         inc ebx
  39.         jmp ciclo
  40.      .endif
  41.      
  42.    mov eax,0
  43.    mov ebx,0
  44.    cpositivo:
  45.       .if ebx < 6
  46.        mov al, b[ebx]
  47.        invoke StdOut, ustr$(eax)
  48.        inc ebx
  49.        jmp cpositivo
  50.       .endif
  51.  
  52.  
  53.    mov eax,0
  54.    mov ebx,0
  55.    print chr$(10)
  56.    cnegativo:
  57.       .if ebx < 6
  58.        mov al, t[ebx]
  59.        invoke StdOut, str$(t[ebx])
  60.        inc ebx
  61.        jmp cnegativo
  62.       .endif
  63.          
  64.     invoke ExitProcess,0
  65.   end inicio
  66.  
  67.  
Gracias por ayudarnos a los que estamos empezando  :hola: