assembly 汇编intel 64字节,打印循环

3gtaxfhh  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(111)

当我想在循环中打印时,我遇到了一个问题。我的想法是打印元素,在这种情况下,集合的差异。但是当它打印第一个元素时,它离开了循环,打印结束。

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

字符串
它应该打印所有的元素的差异,它只打印第一个

xoefb8l8

xoefb8l81#

R8寄存器是notcall-preserved(被调用方保存)。参见What registers are preserved through a linux x86-64 function call
r8应该增加2,因为我的元素是两个字节。但我试图在gdb中看到它,它给了我-127
在 * agencyElementoDiferencia:* 中,你有一个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是高于40),因此执行 terminarPrint
简单地使用一个调用保留寄存器,如RBX,而不是R8。

相关问题