Другие языки программирования и технологии
асемблер ошибка
в коде происходит ошибка когда строка пуста. Как исправить обьясните 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
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
> 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()
sub eax, 4
mov byte ptr r, al
лучше так
xor eax, eax
mov esi, n
lodsb
mov r, eax
а вообще зачем такие извращения? Если есть функция ord()
Валера Пурменцев
ну я так понял если в строке нет символов там окажеться знчение 252?
Валера Пурменцев
ну я так понял если в строке нет символов там окажеться знчение 252?
Похожие вопросы
- как найти количество максимальных элементов в массиве? на асемблере. на асемблере
- с какого языка програмирования стоит начать? с С++ или асемблера??
- //////////////////Маленький вопрос по АСЕМБЛЕРУ\\\\\\\\\\\\\\\\\
- Очень нужна помощь....Асемблер(tasm)
- как заставить ету прогу упак и неупак. BCD (асемблер, масм32)
- Помогите пожалуйста с задачей по асемблеру. Построить конкатенацию (последовательную запись) файла TWO сомого с собой.
- Помогите с асемблером. Знает кто нибудь как там пример решить?
- как поменять максимум и минимум в матрице на асемблере???
- асемблер-надо вот такое сделать вообще не понмаю
- Помогите сделать. СРОЧНО. Асемблер.