Я новичок в сборке и работаю в своей лаборатории для класса сборки. В этой части лабораторной работы мне нужно преобразовать строки в их противоположные заглавные буквы. Так, например:
Если задана строка
Дональд
он должен вернуться
ТЕДОНАЛЬД
Там могут быть точки или другие специальные символы, и в этом случае я бы оставил их в покое. Мне также не разрешено использовать 32-битные регистры. Я должен использовать только 8-битную версию регистров общего назначения x86.
Пока у меня это:
void changeCase(char *string)
{
__asm
{
// BEGIN YOUR CODE HERE
mov eax, string; // move the string into eax
mov ecx, 0; // ecx will be counter
BEGIN_LOOP:
cmp byte ptr[eax + ecx * 1], 0;
je END;
mov al, byte ptr[eax + ecx * 1]; // get the value of the current counter
cmp al, 65; // compare first char with A
jl NEXT_INDEX;
cmp al, 91;
jl UPPER_CASE;
cmp al, 97;
jl NEXT_INDEX;
cmp al, 123;
jl LOWER_CASE;
jmp NEXT_INDEX;
UPPER_CASE: // if upper case, make it lower case then go to next index
add al, 32;
mov byte ptr[eax + ecx * 1], al;
jmp NEXT_INDEX;
LOWER_CASE: // if lower case, make it upper case then go to next index
sub al, 32;
mov byte ptr[eax + ecx * 1], al;
jmp NEXT_INDEX;
NEXT_INDEX:
inc ecx;
jmp BEGIN_LOOP;
END:
// END YOUR CODE HERE
}
}
[\]^_`
, поэтому ему нужен еще один тест (послеxor dl,32
перед записью использованиеcmp dl,'z'
снова исправит это). И я бы предложил использоватьcmp dl,'A'
иcmp dl,'z'
, чтобы было очевидно, что тестируется. И переходы условий неверны, подойдет либоjb + ja
, либоjl + jg
. (и вы заставили меня почувствовать себя ржавым, я не заметил очевидной проблемыmov al,[eax...]
исходного поста :)) 17.03.2017