Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 203
от 01.08.2005, 22:50

Администратор:Калашников О.А.
В рассылке:Подписчиков: 251, Экспертов: 18
В номере:Вопросов: 4, Ответов: 8


Вопрос № 24097: posle koda nije v al zanositsea bukva kotoruiu vvel polizovateli kak uznati ADDRESS etoi bukvi???...
Вопрос № 24112: Вот задал массив: " strs dw ? dup (6)", еще задал 7 переменных. Вопрос: как присвоить каждому элементу массива адрес каждой из семи переменных. Я сделал так: BEGIN: mov ax,offset str1 mov strs[0], ax...
Вопрос № 24113: вот такая таблица: str1 db 'воскресенье',0 str2 db 'понедельник',0 str3 db 'вторник ',0 str4 db 'среда ',0 str5 db 'четверг ',0 str6 db 'пятница ',0 str7 db 'суббота ',0 Вопрос: Предполагая, что во...
Вопрос № 24115: что-то я совсем запутался. 1 CSEG segment 2 assume cs:CSEG, ds:CSEG, ss:CSEG 3 org 100h 4 BEGIN: 5 6 mov ax,offset str1 ; записать адрес в ax 7 mov strs[1], ax ; записать адрес из ax в массив с индексом 1 8 mov ax,off...

Вопрос № 24.097
posle koda nije v al zanositsea bukva kotoruiu vvel polizovateli kak uznati ADDRESS etoi bukvi???

Приложение:

Отправлен: 27.07.2005, 12:10
Вопрос задал: LMZ (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Ddeedd
Здравствуйте, LMZ!

Что за адрес вы имеете в виду? Если вам нужен адрес символа в памяти, то запихните содержимое al в байтовую переменную и получите ее адрес:

data
simvol db 0
...

.code
...
mov ah,10h
int 16h
mov simvol, al
...
lea dx, simvol ; так
...
mov bx, offset simvol ; или так
Ответ отправил: Ddeedd (статус: 3-ий класс)
Отправлен: 27.07.2005, 13:41

Отвечает: Ayl
Здравствуйте, LMZ!

Чего узнать? Какой адрес буквы? Что это за адрес?
Данный код возвращает код клавиши из буфера клавиатуры. Код возвращается в регистрах AH (скен-код) и AL (ASCII-код).
Никакого адреса для них нет, из буфера клавиатуры они уже удалены.
Далее либо работаешь с регистрами, либо сохраняешь их где-нибудь в памяти (по адресу, который сам задашь!), либо выводишь на экран или в файл.

Например, так:

mov ah, 10h
int 16h
mov [char], al
...

char db ?

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 27.07.2005, 13:49

Отвечает: Евгений Иванов
Здравствуйте, LMZ!
эта функция возвращает код символа и скан-код. никакого адреса нет
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 27.07.2005, 20:57


Вопрос № 24.112
Вот задал массив: " strs dw ? dup (6)",
еще задал 7 переменных.
Вопрос: как присвоить каждому элементу массива
адрес каждой из семи переменных.
Я сделал так:

BEGIN:

mov ax,offset str1
mov strs[0], ax
mov ax,offset str2
mov strs[1], ax
mov ax,offset str3
mov strs[2], ax
mov ax,offset str4
mov strs[3], ax
mov ax,offset str5
mov strs[4], ax
mov ax,offset str6
mov strs[5], ax
mov ax,offset str7
mov strs[6], ax
xor ax,ax

int 20h

strs dw ? dup (6) ;------ERROR------ positive count needed

К сожалению компилятор выводит ошибку: "positive count needed"
т.е. нуждается в положительным индексе?
В чем проблема?

Приложение:

Отправлен: 27.07.2005, 17:43
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!

Ну попробуй сам понять, что может означать запись dw ? dup (6).
Я, также как и компилятор, понимаю, что меня просят зарезервировать неизвестное число (?) слов и каждому присвоить значение 6. Т.е. я бы переспросил: "сколько-сколько?"

Писать надо так: dw 6 dup (?)

Теперь о семи переменных. Ты резервируешь 6 слов, а писать хочешь 7 переменных? Маловато будет! Т.ч. в определении массива смело меняй 6 на 7.

Написать, конечно, можно и так, как ты предложил, но можно и не используя ax:
mov word ptr strs [0], OFFSET str1
и т.д.

Но лучше всего (т.к. эта информация статическая) сразу же правильным образом заполнить массив:
strs dw str1, str2, str3, str4, str5, str6, str7

И автоматом получишь массив смещений.
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 27.07.2005, 18:10

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!

ты так кури!

strs dw 7 dup (?)

mov strs[0], offset str1
mov strs[2], offset str2
и т.п.

хотя лучше сделать вот так:

mov bx, ofs strs
mov [bx], offset str1
mov [bx+2], offset str2
...

удачи!
---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 27.07.2005, 19:03
Оценка за ответ: 5
Комментарий оценки:
Вот бы мне увеличить производительность своего мозга, я бы стал ученым, но людям это не подвластно, т.к. ленивые.


Вопрос № 24.113

вот такая таблица:
str1 db 'воскресенье',0
str2 db 'понедельник',0
str3 db 'вторник ',0
str4 db 'среда ',0
str5 db 'четверг ',0
str6 db 'пятница ',0
str7 db 'суббота ',0

Вопрос:
Предполагая, что воскресенье равно 1 и под каждое имя отведено 11 символов,
нужно написать команды прямого доступа к таблице.
Что означает прямой доступ к этой таблице?
Моё предположение, что по адресу.
Я не понял кое что из этого вопроса:
Что означает воскресенье равно 1?
это имя переменной что ли?
Отправлен: 27.07.2005, 17:57
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!

Это означает, что где-то есть переменная weekDay, которая принимает значения от 1 до 7.
Тебе нужно, зная, что weekDay = 1 обозначает воскресенье, написать команды для доступа к соответствующему элементу массива, т.е. к первому символу названия дня недели.
Подскажу, что формула выглядит так: str1 [(weekDay - 1) * 11]
---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 27.07.2005, 18:15


Вопрос № 24.115
что-то я совсем запутался.
1 CSEG segment
2 assume cs:CSEG, ds:CSEG, ss:CSEG
3 org 100h
4 BEGIN:
5
6 mov ax,offset str1 ; записать адрес в ax
7 mov strs[1], ax ; записать адрес из ax в массив с индексом 1
8 mov ax,offset str2
9 mov strs[2], ax
10 mov ax,offset str3
11 mov strs[3], ax
12 mov ax,offset str4
13 mov strs[4], ax
14 mov ax,offset str5
15 mov strs[5], ax
16 mov ax,offset str6
17 mov strs[6], ax
18 mov ax,offset str7
19 mov strs[7], ax
20 xor ax,ax
21
22 ; mov cx,7
23 ; cic:
24 mov ah,09h
25 mov bx,cx
26 lea dx,str1
27 mov dx,strs[1] ; здесь я думаю, что я загружаю непосредственный адрес str1 в dx
28 int 21h
29 ; loop cic
int 20h

str1 db 'voskresene ',0Dh,0Ah,'$'
str2 db 'ponedelnik ',0Dh,0Ah,'$'
str3 db 'vtornik ',0Dh,0Ah,'$'
str4 db 'sreda ',0Dh,0Ah,'$'
str5 db 'chetverg ',0Dh,0Ah,'$'
str6 db 'patnica ',0Dh,0Ah,'$'
str7 db 'subbota ',0Dh,0Ah,'$'
strs dw 7 dup(?)

CSEG ends
end BEGIN
Вопрос:
Я записывал в программе адрес сроки в масив, т.е. адрес строки str1 хранится
в массиве по индексу 1.
что-то я запутался, почему строки 26 и 27 не эквивалентны?

Приложение:

Отправлен: 27.07.2005, 19:00
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
во первых, адрес занимает 16 бит. поэтому все индексы умножай на 2.
сделай так и всё будет тебе. и пироги, и капуста.
:)
удачи!

---------
Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 27.07.2005, 19:10
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо блиннн.

Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!

Потому что команда
mov dx, strs [1] эквивалентна записи mov dx, [OFFSET strs + 1], а не записи mov dx, [OFFSET strs + 1*2]

В ассемблере нет понятия массива. Все сложные структуры данных реализуются программистом с минимальной помощью компилятора. И весь доступ к этим данным должен производиться вручную.
Т.е. если у тебя размер элемента массива 2 байта, будь добр вручную умножить номер элемента на 2.
А так при записи массива смещений ты затираешь старший байт, в результате у тебя получается черте-что.

Кстати, в массиве элементы нумеруются с 0 :-) А не с единицы! По идее, твой код должен выглядеть примерно так:

Приложение:

---------
Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени

Ответ отправил: Ayl (статус: Профессор)
Отправлен: 28.07.2005, 12:35
Оценка за ответ: 5
Комментарий оценки:
Вы как всегда правы! ;-)


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться
Вспомнить пароль

В избранное