problema con saltos en assembler

Iniciado por p4nd4criss, 8 Septiembre 2012, 20:20 PM

0 Miembros y 1 Visitante están viendo este tema.

p4nd4criss

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...


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

~

Comparar 0 con AX siempre va a dar igual a cero o negativo.

mov dX,0
CMP dX,aX



Tal vez si se usa JL:

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.
Sitio web (si la siguiente imagen no aparece es porque está offline):

Nop+

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:

p4nd4criss

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