Вопрос № 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 переменных.
Вопрос: как присвоить каждому элементу массива
адрес каждой из семи переменных.
Я сделал так:
К сожалению компилятор выводит ошибку: "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
и т.п.
удачи!
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 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 Комментарий оценки: Вы как всегда правы! ;-)