![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
Local |
![]()
Сообщение
#1
|
Гость ![]() |
Привет!!
Procedure Pr(Str : String);
begin
Str:=Str+'$';
asm
mov ax,seg(@Data)
mov ds,ax
xor ax,ax
mov ah,9
mov dx,offset Str
int 21h
end
end;
BEGIN
Pr('Hello');
asm
mov ah,0
int 16h
end
End;
Вот объясните почему Я промахиваюсь при вызове локальной перменной в процедуре с параметрами ![]() заранее спасибо |
![]() ![]() |
Local |
![]()
Сообщение
#2
|
Гость ![]() |
Я уж по всякому пробавал
mov ax,seg(Pr)
{ или }
mov ax,seg(Pr(Str))
|
Dark |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Все очень просто, твоя строка хранится встеке, а переменная @Data хранит Data сегмент паскалевской проги(заметь, не ПРОЦЕДУРЫ!)
Большая просьба - востанавливать DS, а то иначе ты изменяешь адрес расположения данных ВСЕЙ программы!!!! Procedure Pr(Str : String);
begin
Str:=Str+'$';
asm
push ds
mov ax,ss
mov ds,ax
xor ax,ax
mov ah,9
lea dx, Str {грузим смещение - Load Effective Address}
inc dx {тожеобрати внимание - Str[0] содержит размер строки, поэтому его вывод нам не интересен}
int 21h
pop ds
end
end;
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Local |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата(Dark @ 12.05.04 17:00) Все очень просто, твоя строка хранится встеке, а переменная @Data хранит Data сегмент паскалевской проги(заметь, не ПРОЦЕДУРЫ!) Большая просьба - востанавливать DS, а то иначе ты изменяешь адрес расположения данных ВСЕЙ программы!!!! 1/@data хранит сегмент начала данных или точку входа в программу ![]() наверно сегмент данных потомучто к глобальным доступ беспромблем 2/остается непонятно почему нужно сохрянять в стеке DS и почему теперь не настаивается сегмент данных DS на начало сегмента тоесть через SS 3/можно по подробнее а то никак не ухвачу мысль ведь в стек можно положить не одну переменную 4/а-а-а- стоп кажись понял DS настраивается на начало стека ведь SS это сегмент стека т.е. 5/lea dx,Str это мы по стекку гуляем я правильно понял или нет P/S/ киньте меня куданить где об этом пишеть я имею ввиду использование ASM внутри PASCAL |
FreeMan |
![]()
Сообщение
#5
|
- ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 480 Пол: Мужской Репутация: ![]() ![]() ![]() |
2) не рекомендуеться менять значение сегментных регистров.
З.Ы. что-то я видел форуме раздел "АЗЫ" - там посмотри! -------------------- бб
|
BlackShadow |
![]()
Сообщение
#6
|
Гость ![]() |
FreeMan, надо просто по-осторожнее это делать, а по возможности вообще избегать.
И в "АЗАХ", единственная функция, которая должна работать нормально (быстро и качественно) - StrLen, сохраняет DS. DS хранит то значение, от которого отталкивается компилятор при адресации глобальных переменных. Т. е. сбив его, всепопытки изменить какую-нибудь твою переменную приведёт к изменению данных где-то там. Далее. Параметры функций адресуются по SS, который далеко не обязательно совпадает с DS => смещение переменной Str надо отсчитывать от SS, поэтому и меняется DS (хотя PUSH SS/POP DS по-моему шустрее и не сбивает AX, но это так, на будующее). |
Dark |
![]()
Сообщение
#7
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата (хотя PUSH SS/POP DS по-моему шустрее и не сбивает AX, но это так, на будующее) pop
push
move
Я УБЕДИЛ? согласен ![]() но все таки на push pop уходит больше времени :D (ну... :p2: по крайней мере на 386... ![]() На тему не одной переменной Procedure Pr(Str,str1 : String);
begin
Str:=Str+'$';
Str1:=Str1+'$';
asm
push ds
mov ax,ss
mov ds,ax
xor ax,ax
mov ah,9
lea dx, Str
inc dx
int 21h
lea dx, Str1
inc dx
int 21h
pop ds
end
end;
ЗЫ я тут файлик прекрепил, intel.doc - старенький конечно =) но все же...(rar3) Прикрепленные файлы ![]() -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Dark |
![]()
Сообщение
#8
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Local, в 5 пункте правильно - тока не гуляем, а грузим смещение ;)
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Shadow |
![]()
Сообщение
#9
|
![]() Lonely_Raven ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 640 Пол: Мужской Репутация: ![]() ![]() ![]() |
Здоровеньки!!!
-------------------------------------- почитал Ваш горячий спор и вот решил выдать инфу насчет оптимизации программы на ASM под семейство микропроцессоров P6(Pentium Pro II/III) учитывая особенности ковейера данных процессора команда выбирается на конвейер устройством выборки команд, которое помещает их в устройство декодирования , состоящее из трех паралельно работающих декодеров 2а простых 1 сложныхю.. Декодеры преобразуют команды микропроцессора в микрооперации представляющие собой примитивные команды которые выполняютя 5-ю работающими паралельными исполнительными устройствами микропроцессора .... ну и так далее ..... Для достижения наибольшей производительности работы декодеров необходимо чтобы на их входы поступали команды декодируемые 6 микрооперациями ------------- некоторые команды декодируются 1 микрооперацией а некоторые >4 ------------- в последовательности 4+1+1 ========================================== ню дак вот ![]() r8,r16,r32 операндв регистре байт слово 2слово m8,m16,m32 память i8,i16,i32 непосредственный операнд a8,a16,a32 отности операнд смещение в сегменте
так что MOV и для современных компов работает быстрее возможно Я и ошибаюсь может есть новая технология, есть еще например предсказания когда процессор анализ код и на основе этого предсказывает след команду если предсказать не удалось то идет момент синхронизации - может не точно ню Я тут не полность привел и вообще чем меньше команд тем медленнее получается это верно для определенного размера программы у меня даже пример где-то есть -------------------- Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ --------------------- RTFM - Read the fucking manual --------------------- http://www.livejournal.com/users/lonley_raven/ |
Guest |
![]()
Сообщение
#10
|
Гость ![]() |
Можно так:
program Hello;
procedure Print(const s: String);
var
ts: String;
begin
ts := s + '$';
asm
push ds
mov ax,ss
mov ds,ax
lea dx,ts[1]
mov ah,9
int 21h
pop ds
end
end;
begin
Print('Hello, World!'#13#10);
asm
xor ax,ax
int 16h
end
end.
...а можно и так: program Hello;
procedure Print(const s: String); assembler;
asm
push ds
lds dx,s
inc dx
mov ah,9
int 21h
pop ds
end
begin
Print('Hello, World!'#13#10'$');
asm
xor ax,ax
int 16h
end
end.
|
![]() ![]() |
![]() |
Текстовая версия | 29.07.2025 4:59 |