Другие языки программирования и технологии

асемблер ошибка

в коде происходит ошибка когда строка пуста. Как исправить обьясните Procedure a(n:ansistring) Begin Asm Mov eax,n Mov al, eax-4 Mov r,al // r эта переменнаЯ типо инт ,...
Видимо, вы хотите получить в переменной r количество символов в строке n. Причём, предполагается, что эта длина не больше 255 символов.

procedure a(n:ansistring);
var r:byte;
asm
mov r,0 //обнуление значение переменной r
test eax,eax // проверка указателя строки на равенство nil
jz @exit // если указатель = 0, то строка пустая -> выход из процедуры
mov dl,[eax-4] // иначе загрузка длины строки в dl
mov r,dl // пересылка длины строки в переменную r
...
@exit: // выход из процедуры
end;

P.S. Почему не используется явная загрузка указателя строки n? Потому что у вас процедура a использует соглашение о передаче параметров pascal, когда первые три параметра передаются через регистры eax, edx и ecx соответственно. В вашем случае процедура получает указатель на строку n в регистре eax.
P.P.S. Константин, в Delphi нельзя так произвольно обращаться с содержимым регистра esi. Разрешается не сохранять содержимое только трёх регистров: eax, ecx и edx.
P.P.P.S. Если всё же регистр al вы написали по ошибке, и длина строки может быть больше 255, то
var r:integer;
и
mov edx,[eax-4] // иначе загрузка длины строки в edx
mov r,edx // пересылка длины строки в переменную r
Артур Гаспарян
Артур Гаспарян
51 590
Лучший ответ
> Mov eax,n

Абсолютно бестолковая строка.
mov eax, n
sub eax, 4
mov byte ptr r, al

лучше так
xor eax, eax
mov esi, n
lodsb
mov r, eax

а вообще зачем такие извращения? Если есть функция ord()
Евгений Дулуб
Евгений Дулуб
12 551
Валера Пурменцев ну я так понял если в строке нет символов там окажеться знчение 252?
Валера Пурменцев ну я так понял если в строке нет символов там окажеться знчение 252?