下划线数组

时间:2016-11-02 17:32:12

标签: assembly masm irvine32

所以在这段代码中,我试图将select * from table2 c right outer join table1 a on c.dt = a.dt and c.ap_no = a.ap_no and c.jy_no = a.jy_no and c.tn = a.tn left outer join table2 b on a.dt = b.dt and a.ap_no = b.ap_no and a.jy_no = b.jy_no and a.t_no = b.t_no ------------------> wrongly implemented it where b.type_cd = 100 and c.type_cd = 200; 插入到数组中,但我真的不知道这段代码有什么问题。因为在_插入阵列时似乎被卡住了。是否有更好的方法来实现或修复代码?

_

2 个答案:

答案 0 :(得分:3)

在循环开始之前,ESI已经指向strUnderscore,因为你以这种方式初始化它。同时,行

mov strUnderscore[ESI], '_'

尝试编写一个字符来处理strUnderscore + ESI。那是不对的。用C语言来说,你现在拥有的是:

char *esi = strUnderscore;
while(...)
{
    strUnderscore[(int)esi] = '_';
    esi++;
}

您需要运行索引或运行指针。将ESI初始化为0(并将其用作索引),或将mov命令中的目标地址更改为byte ptr [ESI]

此外,LOOP是一个错误的命令(查找它)。请考虑减量和条件跳转。

答案 1 :(得分:1)

代码中有两个错误:

  • 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