当我想循环打印时遇到问题。我的想法是打印元素,在这种情况下,是集合的差异。但是当它打印第一个元素时,它会离开循环并且打印结束
msjFinal db "}",10,0
msjElemento db "%c ,",0
msjDiferencia db "Diferencia entre conjuntos: { ",0
conjuntos_0 dw ''
conjuntos_1 dw '2', '8', '6', '7', '5', '3', '8', 'A', 'B', 'D', 'G', 'H', 'U', 'Y', 'Q', 'R', 'Q', '0', 'W', 'L'
conjuntos_2 dw '1', '2', '3', '4', '5', '6', '7', '8', '1', '9', 'P', 'P', 'Q', 'R', 'Z', 'W', 'A', 'B', 'C', 'D'
conjuntos_3 dw '6', '7', '1', '9', '8', '9', 'L', 'A', 'D', 'F', 'P', 'R', 'X', 'S', '0', 'M', 'N', 'Q', 'Z', '5'
conjuntos_4 dw '1', '2', '5', '6', '7', '8', 'A', 'B', 'P', 'O', 'L', 'I', 'S', 'O', '0', 'E', '3', 'N', 'M', 'Z'
conjuntos_5 dw '3', '4', '7', '8', '1', '9', 'N', 'E', 'R', 'O', 'K', 'M', 'V', 'F', 'I', 'A', 'C', 'P', 'D', 'W'
conjuntos_6 dw '5', '3', 'J', '2', 'T', '1', '7', '8', 'X', 'S', 'U', 'Z', 'E', 'B', 'A', 'L', 'P', 'V', 'W', 'Q'
conjuntos dq conjuntos_0, conjuntos_1, conjuntos_2, conjuntos_3, conjuntos_4, conjuntos_5, conjuntos_6
diferenciaDeConjuntos:
mov rdi,msjDiferencia
sub rsp,8
call printf
add rsp,8
mov rcx,[nConjunto1]
mov rdi,[conjuntos + rcx * 8] ; cargo a rdi el 1er conjunto
mov rcx,[nConjunto2]
mov rsi,[conjuntos + rcx * 8] ; cargo a rsi el 2do conjunto
mov r11,0 ; indice para pasar de elemento conjunto1
mov r8,0 ; indice para pasar de elemento conjunto2
diferenciaLoop:
mov dx, word[rsi + r8 ] ; elemento del segundo conjunto
sub rsp,8
call compararElementosPertenencia ; salta a funcion de pertenencia
add rsp,8
cmp byte[elementoPertenece],0 ; si es 1 no lo necesito paso de elemento, si no lo agrego
je agregarElementoDiferencia
add r8,2 ; siguiente elemento
cmp r8,40
je terminarPrint
jmp diferenciaLoop
agregarElementoDiferencia:
mov word[resultadoElemento],dx ; agrego el elemento
mov rdi,msjElemento
mov rsi, [resultadoElemento]
sub rsp,8
call printf
add rsp,8
add r8,2
cmp r8,40
jb diferenciaLoop
sub rsp,8
call terminarPrint
add rsp,8
terminarPrint:
mov rdi,msjFinal
sub rsp,8
call puts
add rsp,8
sub rsp,8
call quiereSeguirOSalir
add rsp,8
ret
它应该打印差异的所有元素,但它只打印第一个
R8 寄存器不调用保留(被调用者保存)。请参阅 通过 linux x86-64 函数调用保留哪些寄存器。
r8 应该增加 2,因为我的元素是两个字节。但我尝试在 gdb 中查看它,它给了我-127
在 agregarElementoDiferencia: 您可以调用
printf
来修改 R8,因此不知道以下期望 R8 完好无损的代码中会发生什么:
add r8,2 cmp r8,40 jb diferenciaLoop sub rsp,8 call terminarPrint add rsp,8
当 gdb 报告 R8 为 -127 时,
cmp r8,40
指令不会低于(-127 远高于 above 40),因此执行 terminarPrint。
只需使用 RBX 等调用保留寄存器而不是 R8。