使用间接寻址在 x86 程序集中复制字符串
Copying a string in x86 assembly using indirect addressing
我对组装还是很陌生,直到今晚才开始理解我想做的大部分事情,所以我可能有很多错误,但我很难说出哪里是因为缺乏经验。
我正在尝试使用 x86 程序集中的间接寻址将字符串从源复制到目标。我试图应用我从这个解释中得到的理解,但我正在努力理解如何将数据@esi 复制到 edi 中。
.data
val1 BYTE 10h,20h,30h
.code
mov esi,OFFSET val1
mov al,[esi] ; dereference ESI (AL = 10h)
inc esi
mov al,[esi] ; AL = 20h
inc esi
mov al,[esi] ; AL = 30h
这是我到目前为止所做的,我实际上已经把它做到了 运行 (!!!) 但不幸的是它根本没有复制。我怀疑我的循环有问题(我不确定如何正确退出它)并且我的复制发生了一些疯狂的事情,但我不知道我哪里出错了:
INCLUDE Irvine32.inc
.data
source BYTE "Source string I want to copy",0
target BYTE SIZEOF source DUP(0)
.code
main PROC
mov esi,OFFSET source
mov edi,OFFSET target
L1:
mov al,[esi] ; get char from source
mov [edi],al ; store it in target
inc esi ;move to next char in source
inc edi ;move to next position in target
cmp al, 28 ;compare al to 28 (the number of chars in source string)
JNZ L1 ;repeat the loop if al != 28 (length of source string)
mov edx, OFFSET source
call WriteString ;Prints out source string (working fine)
mov edx, OFFSET target
call WriteString ;Prints out dest string (working fine)
writestrings 在底部正常工作,因为当 运行ning 使用索引寻址时,我能够将它输出 "Source string I want to copySource string I want to copy" 到控制台。
您的字符串以 NUL 结尾(字符串末尾的 ,0
)。因此,忘记与某些硬编码长度进行比较,如果您修改字符串,则必须更改这些长度;只需检查您读取的字节是否为零:
L1:
mov al,[esi]
mov [edi],al
inc esi
inc edi
test al,al ; you could also use cmp al,0 if you prefer that
JNZ L1 ; repeat the loop if al != 0
我对组装还是很陌生,直到今晚才开始理解我想做的大部分事情,所以我可能有很多错误,但我很难说出哪里是因为缺乏经验。
我正在尝试使用 x86 程序集中的间接寻址将字符串从源复制到目标。我试图应用我从这个解释中得到的理解,但我正在努力理解如何将数据@esi 复制到 edi 中。
.data
val1 BYTE 10h,20h,30h
.code
mov esi,OFFSET val1
mov al,[esi] ; dereference ESI (AL = 10h)
inc esi
mov al,[esi] ; AL = 20h
inc esi
mov al,[esi] ; AL = 30h
这是我到目前为止所做的,我实际上已经把它做到了 运行 (!!!) 但不幸的是它根本没有复制。我怀疑我的循环有问题(我不确定如何正确退出它)并且我的复制发生了一些疯狂的事情,但我不知道我哪里出错了:
INCLUDE Irvine32.inc
.data
source BYTE "Source string I want to copy",0
target BYTE SIZEOF source DUP(0)
.code
main PROC
mov esi,OFFSET source
mov edi,OFFSET target
L1:
mov al,[esi] ; get char from source
mov [edi],al ; store it in target
inc esi ;move to next char in source
inc edi ;move to next position in target
cmp al, 28 ;compare al to 28 (the number of chars in source string)
JNZ L1 ;repeat the loop if al != 28 (length of source string)
mov edx, OFFSET source
call WriteString ;Prints out source string (working fine)
mov edx, OFFSET target
call WriteString ;Prints out dest string (working fine)
writestrings 在底部正常工作,因为当 运行ning 使用索引寻址时,我能够将它输出 "Source string I want to copySource string I want to copy" 到控制台。
您的字符串以 NUL 结尾(字符串末尾的 ,0
)。因此,忘记与某些硬编码长度进行比较,如果您修改字符串,则必须更改这些长度;只需检查您读取的字节是否为零:
L1:
mov al,[esi]
mov [edi],al
inc esi
inc edi
test al,al ; you could also use cmp al,0 if you prefer that
JNZ L1 ; repeat the loop if al != 0