当我想在循环中打印时,我遇到了一个问题。我的想法是打印元素,在这种情况下,集合的差异。但是当它打印第一个元素时,它离开了循环,打印结束。
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
字符串
它应该打印所有的元素的差异,它只打印第一个
1条答案
按热度按时间xoefb8l81#
R8寄存器是notcall-preserved(被调用方保存)。参见What registers are preserved through a linux x86-64 function call。
r8应该增加2,因为我的元素是两个字节。但我试图在gdb中看到它,它给了我-127
在 * agencyElementoDiferencia:* 中,你有一个
printf
的调用,它被允许修改R8,所以在下面的代码中,没有人知道会发生什么,期望R8是完整的:字符串
由于gdb报告R8为-127,
cmp r8,40
指令不会低于(-127是高于40),因此执行 terminarPrint。简单地使用一个调用保留寄存器,如RBX,而不是R8。