【发布时间】:2016-11-23 07:18:18
【问题描述】:
我对组装还是很陌生,直到今晚才开始了解我想做的大部分事情,所以我可能有很多错误,但由于缺乏经验。
我正在尝试使用 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 在底部正常工作,因为我能够在使用索引寻址运行时将“我想复制的源字符串”输出到控制台中。
【问题讨论】:
-
您应该将 al 与 28 进行比较,而不是 esi。并且您的源字符串应以“#”结尾
-
当然可以,您的源字符串不会以“'#”结尾;-)
-
我以前从未见过这个,我不确定它应该去哪里/为什么。你能解释一下这是做什么的以及它到底去哪里了吗?我已经尝试在字符串的引号内,就在外面,就在 0 之后,它仍然会崩溃。 Google / stackoverflow 搜索并没有显示太多关于以“#”结尾的字符串。
-
@Tommylee2k:我不认为评论中的
#指的是字符'#',而是指“数字”一词,如“字符数”(其中恰好是 28 岁)。 -
啊,我明白了。当我阅读我想阅读的内容而不是写的内容时,就会发生这种情况。所以最初的问题是,他将 SI 与 28 进行比较,而不是与“偏移目标 + 28”进行比较,这样可以解决问题。使用终止 0 仍然是解决它的更好方法,你是对的
标签: assembly x86 masm irvine32