假设我必须将字符串存储在.BSS部分中创建的变量中。
var1 resw 5 ; this is "abcde" (UNICODE)
var2 resw 5 ; here I will copy the first one
我如何使用NASM进行此操作? 我试过这样的事情:
mov ebx, var2 ; Here we will copy the string
mov dx, 5 ; Length of the string
mov esi, dword var1 ; The variable to be copied
.Copy:
lodsw
mov [ebx], word ax ; Copy the character into the address from EBX
inc ebx ; Increment the EBX register for the next character to copy
dec dx ; Decrement DX
cmp dx, 0 ; If DX is 0 we reached the end
jg .Copy ; Otherwise copy the next one
所以,第一个问题是字符串不是作为UNICODE复制而是作为ASCII复制,我不知道为什么。其次,我知道可能有一些不推荐使用某些寄存器。最后,我想知道是否有更快的方法可以做到这一点(也许有专门为这种带字符串的操作创建的指令)。我说的是8086处理器。
答案 0 :(得分:1)
inc ebx ; Increment the EBX register for the next character to copy
一个字是2个字节,但你只需要提前{1}} 1个字节。将ebx
替换为inc ebx
。
答案 1 :(得分:1)
但还有另一层理解。如何将字符串从一个缓冲区复制到另一个缓冲区(按字节,单词或双字)并不重要。它将始终创建字符串的精确副本。
因此,如何复制字符串是一个优化问题。使用 rep movsd 是最快的已知方式。
以下是一个例子:
; ecx contains the length of the string in bytes
; esi - the address of the source, aligned on dword
; edi - the address of the destination aligned on dword
push ecx
shr ecx, 2
rep movsd
pop ecx
and ecx, 3
rep movsb