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

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


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

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

Выпуск № 440
от 06.05.2006, 01:35

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


Вопрос № 41714: Здравствуйте. Как получить нужный символ из строки, которую ввел пользователь? Мне нужно было получить первый и последний символ строки...вобщем получал .exe но видимо где-то ошибка в рассуждениях т.к. программа работает не так как хотел...
Вопрос № 41728: Уважаемые эксперты!!! Как мне определить нажатие Ctrl+Alt в следующем куске кода:...

Вопрос № 41.714
Здравствуйте.
Как получить нужный символ из строки, которую ввел пользователь?

Мне нужно было получить первый и последний символ строки...вобщем получал .exe но видимо где-то ошибка в рассуждениях т.к. программа работает не так как хотелось бы:)
Делал так:

Забиваю место под строку BUF db 102 dup(?) , далее
mov BUF, 100
mov dx, offset BUF
mov ah, 0Ah
int 21
Пользователь ввел строку, теперь я запоминаю длину введенной строки
mov bx, [offset BUF+1]
....................................
Далее получаю 1 символ строки в ax
mov di, offset BUF+2
mov ax,[di]
........................................................
Получаю последний символ строки
add di,bx
mov ax,[di]
........................................................
Где моя ошибка???
Отправлен: 30.04.2006, 11:50
Вопрос задал: Denton (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: EPDSota
Здравствуйте, Denton!

2 нестыковки:
1. Длина строки запоминается неправильно:
mov bx, [offset BUF+1]
при этом bx имеет размер 2 байта и захватывается 1-й введенный пользователем символ. правильней будет:
mov bh,0
mov bl,[BUF+1]
2. Получение последнего символа строки:
Если длина длина строки в bx, то прибавляя его к адресу первой строки, мы получим адрес первого символа за концом строки (в данном случае из-за реализации прерывания доса - это будет 0dh). Нужен символ перед этим (кстати - и регистр при этом можно использовать al) - правильней будет:
add di,bx
dec di
mov al,[di]
---------
Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 30.04.2006, 12:24

Отвечает: Пан Павел Константинович
Здравствуйте, Denton!
Меня ругают за теорию! так что перейду сразу к делу.

Вот попробуйте:

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
lea dx,MAX ;offset MAX
mov ah,0Ah ;Num. func.
int 21h ;Interrupt

mov si,dx ;<si> <= offset MAX
inc si ;<si> <= offset LEN

lodsw ;load word(LEN and first symbol)

xor bh,bh ;Можно и не делать НО! желательно!
mov bl,al ;<bl> <= LEN
mov al,[si-2+bx] ;<al> <= End symbol in string

ret ;exit

MAX db 100 ;MAX enter symbols
LEN db ? ;Len. string
BUF db 100 dup(?) ;Buffer for string

CSEG ends
end Begin
Извените что коментарии на Англ. просто писал в Блокноте с шрифтом "Terminal", превычка.
Подрузумевается что регистр <bx> обнулён! пере использованием.

С, Уважением MnEm0n!C.

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 7-ой класс)
Ответ отправлен: 30.04.2006, 13:41
Оценка за ответ: 5
Комментарий оценки:
Пасиб:)

Отвечает: Sergijj
Здравствуйте, Denton!

Ошибка видна невооружённым глазом:
При чтении длины строки (mov bx, [offset BUF+1]) Вы читаете _слово_, а не байт (т.е. читаете сразу и длину строки и первый символ, точнее "длина строки + код первого символа, смещённый на 8 влево"), а потом всё это складываете со смещением начала строки и получаете конец строки гораздо дальше, чем предполагалось.

Лучше бы было написать что-то типа:
;В прочтении длины строки
xor bx,bx
mov bl, byte ptr [offset BUF+1]

,либо

;В определении конца строки
add di, word ptr bl
.

Удачи!
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 3-ий класс)
Ответ отправлен: 02.05.2006, 15:15


Вопрос № 41.728
Уважаемые эксперты!!! Как мне определить нажатие Ctrl+Alt в следующем куске кода:

Приложение:

Отправлен: 30.04.2006, 17:26
Вопрос задал: Александр А.А. (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Joy~
Здравствуйте, Александр А.А.!
VK_CONTROL ------ (клавиша Ctrl)
VK_MENU ------------(клавиша Alt)
Для того чтобы определить состояние клавишь используйте Функцию WinAPI
GetAsyncKeyState
Описание:
function GetAsyncKeyState(Key: Integer): Integer;

Опpеделяет состояние виpтуальной клавиши.

Паpаметpы:
Key: Код виpтуальной клавиши.

Возвpащаемое значение:
Если установлен стаpший байт, клавиша Key находится в нажатом положении, а если младший - то клавиша Key была нажата после пpедыдущего вызова функции.

функция находится в файле user32.dll

Есть конечно и другие способы узнать но это то что первым пришло в голову...
В приложении код.
Удачи!

Приложение:

---------
ЮЗВЕРЬ!! ЮЗВЕРЮ!....

Ответ отправил: Joy~ (статус: 5-ый класс)
Ответ отправлен: 02.05.2006, 09:59


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.32 от 03.05.2006
Яндекс Rambler's Top100

В избранное