这个代码用于反转字符串
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
source BYTE "This is the source string",0
target BYTE SIZEOF source DUP('#')
.code
main PROC
; Point ESI to the last character in the source string:
mov esi,OFFSET target - 2
; Point EDI to the beginning of the target string:
; We do not copy the null terminator byte.
mov edi,OFFSET target
mov ecx,SIZEOF source-1 ; loop counter
L1: mov al,[esi] ; get a character from source
mov [edi],al ; store it in the target
dec esi ; move to next character
inc edi
loop L1 ; repeat for entire string
mov BYTE PTR [edi],0 ; add a null byte to the target
invoke ExitProcess,0
main endp
end main
有人可以向我解释这一切意味着什么吗?我看着寄存器移动了,当ECX等于0时,循环似乎结束了。为什么这样?注意解释每段代码?
编辑1:我看到ecx是在“mov ecx,SIZEOF source-1”中定义的,每次都会占用1个。
答案 0 :(得分:5)
正如您可以阅读here loop
指令递减ECX,如果它不是0则跳转,如果它是0则跳转。
edi
用作指向字符串结尾的指针。
ecx
设置为字符串的长度
此行是偷偷摸摸的:mov esi,OFFSET target - 2
循环相当于:
a = 0;
b = source.length - 1;
for (int i = source.length; i >= 0; i++) {
target[a] = source[b];
a++;
b--;
}
答案 1 :(得分:2)
LOOP使用ECX作为循环计数器,它会减少它,然后如果它不为零则跳转到标签。