汇编英特尔64字节,打印循环

问题描述 投票:0回答:1

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

 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

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

assembly x86-64 nasm
1个回答
0
投票

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。

© www.soinside.com 2019 - 2024. All rights reserved.