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

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


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

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

Выпуск № 400
от 17.03.2006, 20:05

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


Вопрос № 37280: Здравствуйте уважаемые эксперты. Я столкнулся со следующим затруднением. Пытаюсь сделать фильтрацию ввода, программа должна позволять вводить 0..9, a..z (нижний регистр), а на остальное не реагировать. Для этого я планировал сделать сравнение по ...
Вопрос № 37285: Здрасьте. Я вот типа "учу" ассемблер. 1. Вопрос може ламерский и философский. Почему так мало рабочих регистров? Что разработчикам жалко десяток "8 бит" лишних добавить, чтоб не было геммороя отслеживания регистров. <...
Вопрос № 37299: Здравствуйте уважаемые эксперты. В книге "Справочная система по языку ассемблера IBM PC" В.И.Юрова, я наткнулся на операторы сравнения: eq, ne, lt, le, gt, ge. Вопрос можно ли использовать их в tasm5.0? ...
Вопрос № 37316: Здравствуйте! Среды компиляции разные (MS-DOS6.22, Windows NT WS4.0sp6, Windows XP home sp1) Проблема с компиляцией в MASM61: ml abel59.asm /AT page 60,132 ;Директива, указывающая кол-во распечатываемых ;на листе строк и симво...
Вопрос № 37329: Здравствуйте, уважаемые эксперты! "Команда je переведётся программой-ассемблером в jz. Это легко проверить, если после ассемблирования запустить программу под отладчиком. Разницы между je и jz нет никакой!" Вопрос: а если нет разниц...

Вопрос № 37.280
Здравствуйте уважаемые эксперты.
Я столкнулся со следующим затруднением. Пытаюсь сделать фильтрацию ввода, программа должна позволять вводить 0..9, a..z (нижний регистр), а на остальное не реагировать. Для этого я планировал сделать сравнение по ASCII символам:

esc_ equ 1Bh

next:
mov ah, 08h ; ввод с клавиатуры без эха
int 21h ; ... результат ввода в al

cmp al, 0 ; если код клавишы не расширенный, при этом
jnz m1 ;al != 0 то переход на m1 (jnz - переход если не ноль)
cmp al,0 ; если код клавишы расширенный, при этом al=0
je m2 ; то переход на m2 (je - если равно)

m1:
cmp al, esc_ ; если нажата esc, то на
je exit ; метку exit

; --- I условие ---
cmp al, 61h ; 61h - 'a'
jl next ; если < a в код. табл.

cmp al, 7Ah ; 7Ah - 'z'
jg next ; если > z в код. табл.

; --- II условие ---
cmp al, 30h ; 30h - 0
jl next ; если <0

cmp al, 39h ; 39h - 9
jg next ; если >9

mov dl, al
mov ah, 02h ; 02h функция Dos
int 21h

jmp next

Но оказалось, что эти условия как бы “накладываются” друг на друга. Это связано со сравнением, хотя по отдельности они работают.
Подскажите, пожалуйста, может, есть другой путь в моей ситуации?
Или два моих условия можно как-то объединить, чтобы они не накладывались друг на друга?
В приложении полный текст программы. Заранее благодарю за помощь.

Приложение:

Отправлен: 11.03.2006, 22:10
Вопрос задал: Martin (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Лысков Игорь Витальевич
Здравствуйте, Martin!

Например, так, как в приложении
Удачи!

Приложение:

---------
Удачи!

Ответ отправил: Лысков Игорь Витальевич (статус: Студент)
Ответ отправлен: 11.03.2006, 22:37
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за ответ и помощь применительно к моему коду.

Отвечает: Пан Павел Константинович
Здравствуйте, Martin!
Как дала у вас?
"Что бы решить задачу разбейте её на более простые модули".
Попробуйте вот так:

Вывод от a-z, 0-9, выход ESC. Код остался без изменения если не считать jmp short L1. Программа типа: *.COM

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
.286
Begin:
next:
mov ah, 08h ; ввод с клавиатуры без эха
int 21h ; ... результат ввода в al

cmp al, 0 ; если код клавишы не расширенный, при этом
jnz m1 ;al != 0 то переход на m1 (jnz - переход если не ноль)
;cmp al,0 ; если код клавишы расширенный, при этом al=0
;je m2 ; то переъход на m2 (je - если равно)

m1:
cmp al, 1Bh ; если нажата esc, то на
je exit ; метку exit

; --- I условие ---
cmp al, '0'
jb next ; если ниже 0

cmp al, 'z'
ja next ; если выше z

cmp al, 'a'
jb nextS ; если ниже a
jmp short L1
nextS:
cmp al, '9'
ja next ; если выше 9
L1:
mov dl, al ; загрузка в dl кода символа
mov ah, 02h ; 02h функция Dos
int 21h ; вывод символа

jmp next

exit:
int 20h
CSEG ends
end Begin


---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 3-ий класс)
Ответ отправлен: 12.03.2006, 00:38
Оценка за ответ: 5
Комментарий оценки:
Благодарю за помощь и альтернативный вариант кода условий.


Вопрос № 37.285
Здрасьте. Я вот типа "учу" ассемблер.
1. Вопрос може ламерский и философский.
Почему так мало рабочих регистров? Что разработчикам жалко десяток "8 бит" лишних добавить, чтоб не было геммороя отслеживания регистров.

2. Что такое софтайс и зачем оно нужно?
Отправлен: 11.03.2006, 23:23
Вопрос задал: Shevaa (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Angel13
Здравствуйте, Shevaa!
Почему мало???
eax,ebx,ecx,edx,edi,esi,ebp,esp - аж 8 штук.
cs,ds,es,ss,fs,gs
mm0...mm7 - аж 8 штук.
st0...st7 - аж 8 штук.
Есть ещё теневые регистры...недоступны.
К примеру может и грубо...
В музыке всего-лишь СЕМЬ НОТ - 7 НОТ а какая разнообразная ОНА.
Вот такое колличество регистров способствует к мышлению более тонкому, радикальному подходу их использовать.
А Вы подумайте сколько построено программ с помощью Как вы выразились малому колличеству регистров....и причём всё работает, целые системы.
*********************************************************************
Что такое SoftIce???
Профессионалный отладчик.
Служит для отладки программ и систем, к примеру Windows - полностью вырубает систему для отслеживания(что же она там делает???)
Вот вам ссылочка,почитайте....
http://www.wasm.ru/article.php?article=1022007#p2
Удачи!!!
---------
Прорвёмся....
Ответ отправил: Angel13 (статус: 4-ый класс)
Ответ отправлен: 13.03.2006, 08:39
Оценка за ответ: 5


Вопрос № 37.299
Здравствуйте уважаемые эксперты. В книге "Справочная система по
языку ассемблера IBM PC" В.И.Юрова, я наткнулся на операторы
сравнения: eq, ne, lt, le, gt, ge. Вопрос можно ли использовать
их в tasm5.0?
Отправлен: 12.03.2006, 00:59
Вопрос задал: Gogenot (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: FreeManC
Здравствуйте, Gogenot!
хм это приставки к jxx, если убрать оттуда t и q. то бишь, например, после проверки условия можно исспользовать. je,jne,jl,jle,jg,jge для прыжка в случае равенства, неравенства...
Ответ отправил: FreeManC (статус: 2-ой класс)
Ответ отправлен: 13.03.2006, 16:08
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое. А то я часа два парился пытаясь
скомпилить типа: gt ax,dx. Просто справочник неудобочитаемый.


Вопрос № 37.316
Здравствуйте!
Среды компиляции разные (MS-DOS6.22, Windows NT WS4.0sp6, Windows XP home sp1)
Проблема с компиляцией в MASM61:
ml abel59.asm /AT
page 60,132 ;Директива, указывающая кол-во распечатываемых
;на листе строк и символов в строке. Абель,с.54
TITLE exasm1 (EXE) Пример регистровых операций; TITLE - директива
;ассемблера, задаёт заголовок
;------------------------------------------------------------------
STACKSG SEGMENT PARA STACK 'Stack' ;Описание
;имя директивы директива параметры сегментов
;директивой SEGMENT
DB 12 DUP('STACKSEG')
STACKSG ENDS ;Окончание директивы SEGMENT
;начало директивы PROC. Сегмент кода содержит выполняемые команды
;программы. Кроме того, включает процедуры,
;определённые директивой PROC, Абель,с.55
BEGIN PROC FAR
;имя процедуры директива прочие_элементы_языка
ASSUME SS:STACKSG, CS:CODESG, DS:NOTHING
;директива ASSUME сообщает ассемблеру назначение каждого сегмента
PUSH DS ;запись DS в стек
SUB AX,AX ;обнулить AX вычитанием AX из AX
PUSH AX ;записать ноль в стек
MOV AX,0123H;записать 0123 шестнадцатиричное в стек
ADD AX,0025H;прибавить 25 к AX
MOV BX,AX ;переслать AX в BX
ADD BX,AX ;прибавить AX к BX
MOV CX,BX ;переслать BX в CX
SUB CX,AX ;вычесть AX из CX
SUB AX,AX ;обнулить AX
NOP ;нет операции, небольшой простой процессора
RET ;return to DOS
;может быть, команда возврата в вызывающую проедуру
BEGIN ENDP ;конец процедуры BEGIN
CODESG ENDS ;конец сегмента CODESG
END BEGIN ;конец программы BEGIN
Выдаёт следующие сообщения:
Microsoft (R) MASM Compatibility Driver
Copyright (C) Microsoft Corp 1991. All rights reserved.

Invoking: ML.EXE /I. /Zm /c /Ta abel59.asm

Assembling: abel59.asm
abel59.asm(14): error A2034: must be in segment block : BEGIN
abel59.asm(18): error A2034: must be in segment block
abel59.asm(19): error A2034: must be in segment block
abel59.asm(20): error A2034: must be in segment block
abel59.asm(21): error A2034: must be in segment block
abel59.asm(22): error A2034: must be in segment block
abel59.asm(23): error A2034: must be in segment block
abel59.asm(24): error A2034: must be in segment block
abel59.asm(25): error A2034: must be in segment block
abel59.asm(26): error A2034: must be in segment block
abel59.asm(27): error A2034: must be in segment block
abel59.asm(28): error A2034: must be in segment block
abel59.asm(29): error A2034: must be in segment block
abel59.asm(31): fatal error A1010: unmatched block nesting : BEGIN

В MASM32:
ml abel59.asm /AT
ругается так:
Assembling: ABEL59.ASM
ABEL59.ASM(14) : error A2034: must be in segment block : BEGIN
ABEL59.ASM(18) : error A2034: must be in segment block
ABEL59.ASM(19) : error A2034: must be in segment block
ABEL59.ASM(20) : error A2034: must be in segment block
ABEL59.ASM(21) : error A2034: must be in segment block
ABEL59.ASM(22) : error A2034: must be in segment block
ABEL59.ASM(23) : error A2034: must be in segment block
ABEL59.ASM(24) : error A2034: must be in segment block
ABEL59.ASM(25) : error A2034: must be in segment block
ABEL59.ASM(26) : error A2034: must be in segment block
ABEL59.ASM(27) : error A2034: must be in segment block
ABEL59.ASM(28) : error A2034: must be in segment block
ABEL59.ASM(29) : error A2034: must be in segment block
ABEL59.ASM(31) : fatal error A1010: unmatched block nesting : BEGIN
Отправлен: 12.03.2006, 10:14
Вопрос задал: Uzhas (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

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

Просто удалил строку, похожую на:
...
STACKSG ENDS ;Окончание директивы SEGMENT
CODESG segment 'TEXT'; - строка, которая нужна
;начало директивы PROC. Сегмент кода содержит выполняемые команды
...

она сообщает, что начался сегмент кода программы "TEXT". Без нее получилось, что указанные дальше процедуры неизвестно где находятся. Хотя есть команда конца сегмента "CODESG ends".
---------
Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 12.03.2006, 11:32
Оценка за ответ: 4
Комментарий оценки:
Спасибо за оперативность! Но исправления-то программе не помогли :-)

Отвечает: Angel13
Здравствуйте, Uzhas!
А сегмент кода где??
А где метка начала??
В приложении рабочая програмка!

Приложение:

---------
Прорвёмся....

Ответ отправил: Angel13 (статус: 4-ый класс)
Ответ отправлен: 13.03.2006, 09:42
Оценка за ответ: 5


Вопрос № 37.329
Здравствуйте, уважаемые эксперты!
"Команда je переведётся программой-ассемблером в jz. Это легко проверить, если после ассемблирования запустить программу под отладчиком. Разницы между je и jz нет никакой!"
Вопрос: а если нет разницы, то почему их две?
Отправлен: 12.03.2006, 12:39
Вопрос задал: Москвин Роман Валерьевич (статус: 5-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: EPDSota
Здравствуйте, Москвин Роман Валерьевич!

Для понятности. Таких команд много - например jae-jnb (jna-jbe), jge-jnl (jle-jng).
---------
Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 12.03.2006, 13:01
Оценка за ответ: 5

Отвечает: FreeManC
Здравствуйте, Москвин Роман Валерьевич!
разница в подтексте je подразумевает, что производится проверка равенства, а jz - проверка нуля. то же самое как jl-jnae, ja-jnle... облегчает понимание программы.
Ответ отправил: FreeManC (статус: 2-ой класс)
Ответ отправлен: 13.03.2006, 16:10
Оценка за ответ: 4


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.20 (beta) от 17.03.2006
Яндекс Rambler's Top100

В избранное