下划线数组
Array of underscore
所以在这段代码中,我试图将 _
插入到一个数组中,但我真的不知道这段代码有什么问题。因为当 _
被插入数组时它似乎被卡住了。有没有更好的方法来实现或修复代码?
.data
strUnderscore BYTE 20 DUP (?) ;the array
.code
mov ECX,stringLength
mov ESI, OFFSET strUnderscore
L1:
mov strUnderscore[ESI], '_' ;the code runs but stucks here
inc ESI
loop L1
mov EDX, OFFSET strUnderscore
call WriteString
在循环开始之前,ESI 已经指向 strUnderscore,因为你是这样初始化它的。与此同时,行
mov strUnderscore[ESI], '_'
尝试将字符写入地址 strUnderscore + ESI。那是不对的。在类似 C 的术语中,您现在拥有的是:
char *esi = strUnderscore;
while(...)
{
strUnderscore[(int)esi] = '_';
esi++;
}
您需要 运行 索引或 运行 指针。要么将 ESI 初始化为 0(它将用作索引),要么将 mov
命令中的目标地址更改为 byte ptr [ESI]
.
此外,LOOP 是一个错误的命令(查找)。改为考虑递减和条件跳转。
您的代码中有两个错误:
- ESI 是指针,不是索引。
- 编译器不知道“_”的大小。
让我们修复它们:
.data
strUnderscore BYTE 20 DUP (?) ;the array
.code
mov ECX,stringLength
mov ESI, OFFSET strUnderscore ;◄■■ ESI IS POINTER TO THE VARIABLE.
mov AL, '_' ;◄■■ MOVE THE "_" INTO A ONE BYTE REGISTER.
L1:
mov [ESI], AL ;◄■■ USE THE POINTER ESI, THE VARIABLE IS NOT NECESSARY.
inc ESI
loop L1
mov EDX, OFFSET strUnderscore
call WriteString
所以在这段代码中,我试图将 _
插入到一个数组中,但我真的不知道这段代码有什么问题。因为当 _
被插入数组时它似乎被卡住了。有没有更好的方法来实现或修复代码?
.data
strUnderscore BYTE 20 DUP (?) ;the array
.code
mov ECX,stringLength
mov ESI, OFFSET strUnderscore
L1:
mov strUnderscore[ESI], '_' ;the code runs but stucks here
inc ESI
loop L1
mov EDX, OFFSET strUnderscore
call WriteString
在循环开始之前,ESI 已经指向 strUnderscore,因为你是这样初始化它的。与此同时,行
mov strUnderscore[ESI], '_'
尝试将字符写入地址 strUnderscore + ESI。那是不对的。在类似 C 的术语中,您现在拥有的是:
char *esi = strUnderscore;
while(...)
{
strUnderscore[(int)esi] = '_';
esi++;
}
您需要 运行 索引或 运行 指针。要么将 ESI 初始化为 0(它将用作索引),要么将 mov
命令中的目标地址更改为 byte ptr [ESI]
.
此外,LOOP 是一个错误的命令(查找)。改为考虑递减和条件跳转。
您的代码中有两个错误:
- ESI 是指针,不是索引。
- 编译器不知道“_”的大小。
让我们修复它们:
.data
strUnderscore BYTE 20 DUP (?) ;the array
.code
mov ECX,stringLength
mov ESI, OFFSET strUnderscore ;◄■■ ESI IS POINTER TO THE VARIABLE.
mov AL, '_' ;◄■■ MOVE THE "_" INTO A ONE BYTE REGISTER.
L1:
mov [ESI], AL ;◄■■ USE THE POINTER ESI, THE VARIABLE IS NOT NECESSARY.
inc ESI
loop L1
mov EDX, OFFSET strUnderscore
call WriteString