Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: p4nd4criss en 8 Septiembre 2012, 20:20 pm



Título: problema con saltos en assembler
Publicado por: p4nd4criss en 8 Septiembre 2012, 20:20 pm
hola a todos
soy novato con el assembler
estoy tratando de resolver este problema. un programa k lea 10 números y guarde en un dirección de memoria el numero de negativos
tengo un problema con el salto. no salta, se supone k salte si el numero es negativo ,para k no llame a la funcion, pero no salta, me pueden dar una sugerencia?
ya intente con todo, ja jb je js jl etc...

Código:
org 100h

vec db -2,1,3,-4,-5,6,-7,8,9,5
                
start:
lea si,vec
mov [400h],0              
mov cx , 10
com:
mov ax,[si]
inc si
mov dX,0
CMP dX,aX
Js menor;<<<aki es donde no salta o salta cuando no debe
ok:
loop com
mov ax , [400h]
mov bx , [401h]
hlt

menor:  
    add [400h],1
    jmp ok  
es assembler para el emu8086
gracias


Título: Re: problema con saltos en assembler
Publicado por: ~ en 8 Septiembre 2012, 20:42 pm
Comparar 0 con AX siempre va a dar igual a cero o negativo.

Código:
mov dX,0
CMP dX,aX


Tal vez si se usa JL:

Código:
JL menor;<<<aki es donde no salta o salta cuando no debe

Pero lo mejor sería poner el pseudocódigo, como algo tipo C, para ver si tiene sentido lo que se trata de hacer.

JL comprueba que SF != OF.

JS solo comprueba que SF = 1.

Aquí SF (bandera de signo) siempre va a ser 1 (o sea número negativo) a menos que AX sea 0 porque con cmp dx,ax, siempre se comprueba la resta de 0-AX.


Título: Re: problema con saltos en assembler
Publicado por: Nop+ en 19 Septiembre 2012, 23:28 pm
Más o menos sería esto, te lo he puesto comentado para que te des cuenta de cada una de las instrucciones



xor      esi,esi
      xor      ecx,ecx
      xor      eax,eax
      xor      edx,edx            ; Inicializamos todos los valores
      mov      ecx,10            ; Le asignamos a ecx contador
            
      bucle:
      mov      ah, byte ptr[Tabla+si]   ; movemos el primer valor de la tabla a eax
      inc      esi               ;Incrementamos el puntero a la cadena
      cmp      ah,0            ; el número es menor que cero?
      jl      negativo         ; Salta si es negativo
      loop   bucle            ;volvemos a empcezar
      jmp      salir
      negativo:
               
      add      edx,1            ; Aquí vamos contando los números negativos que encontramos
      loop   bucle            ; Seguimos mientras el contador no llegue a cero
      salir:


Título: Re: problema con saltos en assembler
Publicado por: p4nd4criss en 22 Septiembre 2012, 19:37 pm
gracias por sus respuestas
finalmente me di cuenta k el debia ehacer un salto antes de escrbirnir lo del vector
jmp inicio:
vectob db 1,2,3,4,5
inicio:

para evitar errores
y que debía comparar usando registros de 8 bits
es decir usar al bl cl dl aha bh ch dh
y no usar el registro completo como ax bx cx dx
gracias