Вопрос № 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 в следующем куске кода:
Отвечает: 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