记忆转移英特尔组装AT& T

时间:2015-05-16 14:38:43

标签: memory assembly x86 intel

我在将字符串从一个内存地址按字节顺序移动到另一个内存地址时遇到问题。在这几个小时,并尝试了一些不同的策略。我是英特尔公司的新手,所以我需要一些技巧和见解来帮助我解决问题。

getText例程应该将n(从%rsi中找到)字节从ibuf传输到%rdi中的地址。 counterI是用于指示从何处开始传输的偏移量,并且在例程结束后它应该指向未传输的下一个字节。如果没有n个字节,它应该取消传输并返回在%rax中传输的实际字节数。

getText:
        movq    $ibuf, %r10
        #in rsi is the number of bytes to be transfered
        #rdi contains the memory adress for the memory space to transfer to
        movq    $0, %r8     #start with offset 0
        movq    $0, %rax    #zero return register
        movq    (counterI), %r11
        cmpb    $0, (%r10, %r11, 1) #check if ibuf+counterI=NULL
        jne MOVE            #if so call and read to ibuf
        call    inImage
    MOVE:       
        cmpq    $0,%rsi         #if number of bytes to read is 0
        je  EXIT            #exit
        movq    counterI, %r9       
        movq    $0, %r9         #used for debugging only shold not be 0
        movb  (%r10, %r9, 1), %bl   #loads one byte to rdi from ibuf
        movb  %bl, (%rdi, %r8, 1)
        incq    counterI        #increase pointer offset
        decq    %rsi            #dec number of bytes to read
        incq    %r8         #inc offset in write buffert
        movq    %r8, %rax       #returns number of bytes wrote to buf 
        movq    (counterI), %r9 
        cmpb    $0, (%r10, %r9,1)   #check if ibuf+offset is NULL
        je  EXIT            #if so exit
        cmpq    $0, %rsi        #can be cleaned up later
        jne MOVE
    EXIT:
        movb    $0, (%rdi, %r8, 1)  #move NULL to buf+%r8?          
        ret

1 个答案:

答案 0 :(得分:2)

movq    counterI, %r9       
movq    $0, %r9         #used for debugging only shold not be 0

第二条指令使第一条指令无用,但鉴于我明白你会删除它。更好的是,如果你将%R9的每次出现都改为%R11,你可以删除两者。

movzbq  (%r10, %r9, 1), %r10    #loads one byte+zeroes to rdi from ibuf
movq    %r10, (%rdi, %r8, 1)    #HERE IS THE PROBLEM I THINK

这是一个危险的构造。您首先使用%R10作为地址,但随后在其中删除零扩展数据字节。稍后在代码中你将再次使用%R10作为地址,但遗憾的是,它不会在那里!解决方案是进入一个不同的寄存器,不要担心零延伸。

movb  (%r10, %r9, 1), %bl   #loads one byte to rdi from ibuf
movb  %bl, (%rdi, %r8, 1)

可以缩短以下代码

 cmpb    $0, (%r10, %r9,1)   #check if ibuf+offset is NULL
 je  EXIT            #if so exit
 cmpq    $0, %rsi        #can be cleaned up later
 jne MOVE
EXIT:

作为

 cmpb    $0, (%r10, %r9, 1)   #check if ibuf+offset is NULL
 jne MOVE
EXIT: