[2021][Febrero][Problema 2]

[2021][Febrero][Problema 2]

de Antonio Andres Gonzalez Ricca -
Número de respuestas: 1

Buenas noches, me gustaría saber si mi solución esta bien planteada, ya que es muy diferente a la de la solución dada y ademas tengo unas preguntas para realizar:

1)Cuando hago cmp ds:[bx+si],0 esta bien poner el ds? Ya que en la solución no aparece.

2) Despues de hacer el call largos, podria hacerle pop ax directamente? 


proc largos
push bp
mov bp,sp
push bx
push ax
push si
push dx
mov bx, [bp+4] ; bx= nodo_actual
cmp bx, 0
je null
xor si,si
xor ax,ax
loop:
cmp ds:[bx+si],0 ; poner el ds esta bien?
je fin1
inc si ; largo + 1
jmp loop
null:
xor ax, ax
jmp fin
fin1:
push [bx + 2] ; nodo_siguiente
call largos
pop dx
add ax,dx ; ax es lo que retorno
     ;dx = largos(act->sigui)
add ax, si ; largo
fin:
mov [ bp+4],ax ; pone el resultado abajo de la ip en el stack
pop dx
pop si
pop ax
pop bx
pop bp
ret
endp largos


Desde ya muchas gracias, saludos.

(Editado por Gustavo Brown [formateo de código] - envío original miércoles, 13 de diciembre de 2023, 20:24)

En respuesta a Antonio Andres Gonzalez Ricca

Re: [2021][Febrero][Problema 2]

de Gustavo Brown -

Tu solución tiene varios errores:

En BX tenés el desplazamiento al nodo. DS:[BX] apunta al puntero al string, no al contenido del string.

Por lo tanto tenes que dereferenciar el puntero:

   mov BX, [BX]  ;  cargo en BX la dirección del primer byte de string

Luego donde pusiste

cmp ds:[bx+si],0 ; poner el ds esta bien?

está bien poner DS: pero no es necesario porque por defecto para ese acceso a memoria igualmente se utiliza el segmento DS

Lo que está mal es que no indicas que la comparación es de a byte. Deberias poner

cmp byte ptr ds:[bx+si],0 

o más sencillo

cmp byte ptr [bx+si],0 

Luego previo a donde pusiste

push [bx + 2] ; nodo_siguiente

deberías volver a cargar el puntero al nodo (puesto que más arriba lo sobreescribi con la direccion del inicio de BX):

mov BX, [BP-2]  ; cargo en BX la direccion de actual

Sobre tu otra pregunta, podrías hacer pop AX directamente.

Saludos,
  Gustavo