2016-11-02 8 views
1

Так что в этом коде я пытаюсь вставить _ в массив, но я действительно не знаю, что не так с этим кодом. Потому что он, кажется, застревает, когда _ вставляется в массив. Есть ли лучший способ реализовать или исправить код?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 

ответ

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

или 'респ stosb' вместо ручного цикла байт. –

+1

ОП все еще изучает самые основы. Пусть она отлаживает цикл. –

+0

Когда я изменил команду адреса назначения в mov на [ESI], программа не могла работать. В нем указаны недопустимые операнды команд в этой строке. Вы знаете, в чем причина? – student001

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 
+1

и, поскольку' al' не изменяется во время всего цикла, 'mov al,' _'' может быть опережающим' L1: '. :) – Ped7g

+0

@ Ped7g, отредактированный с вашим предложением :) –