将字符串从BSS变量复制到Assembly中的BSS变量

时间:2013-08-30 14:35:21

标签: string assembly copy nasm

假设我必须将字符串存储在.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处理器。

2 个答案:

答案 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