下划线数组

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