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