有人可以解释这段代码
Can someone explain this code
有这段代码可以反转字符串
.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。
LOOP 使用 ECX 作为循环计数器,它减少它然后如果它不为零则跳转到标签。
如您所见,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--;
}
有这段代码可以反转字符串
.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。
LOOP 使用 ECX 作为循环计数器,它减少它然后如果它不为零则跳转到标签。
如您所见,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--;
}