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

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


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

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

Выпуск № 454
от 23.05.2006, 10:05

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


Вопрос № 43302: Здравствуйте! Еще один вопрос: Ввести с клавиатуры произвольный русский (и только русский ) символ. ...
Вопрос № 43315: Уважаемые эксперты! Помогите сдать сессию! Мне срочно нужна программа на ассемблере, которая бы складывала шестнадцатиразрядные двоичные числа, а результат выдавала в десятичной форме, т.е. (bin+bin)-->dec. ..
Вопрос № 43382: Тут возникли проблемы с программами по ассемблеру Собственно вот 2 штуки 1. Определить, содержит ли байт данных в кодовом сегменте в разрядах 6-2 двоичную комбинацию 11010. Если да, то сформировать код в регистре ВН следующим образо...
Вопрос № 43412: privet, u menya zada4ka: napisat' prozeduru "sum". polu4aet adress ofseta na4ala matrizu iz 10 znakovuh 4isel, razmerom byte. prozedura vozvras4aet v "ax" summu^2 vseh 4isel matrizu. stack: sp ukazuvaet na adress vozvr...

Вопрос № 43.302
Здравствуйте! Еще один вопрос:
Ввести с клавиатуры произвольный русский (и только русский ) символ.
Отправлен: 17.05.2006, 09:58
Вопрос задал: Iluha (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

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

Кодировки русских символов:

IBM866 (DOS):
'А'-'Я': 128 - 159;
'Ё' (йо): 240;
'а' - 'п': 160 - 175
'р' - 'я': 224 - 239
'ё': 241

CP1251 (WIN):
'А'-'Я': 192 - 223;
'Ё' (йо): 168;
'а' - 'п': 224 - 239
'р' - 'я': 240 - 255
'ё': 184

ISO8859-5 (UNIX):
'А'-'Я': 176 - 207;
'Ё' (йо): 161;
'а' - 'п': 208 - 223
'р' - 'я': 224 - 239
'ё': 241

Apple Cyrillic (MAC):
'А'-'Я': 128 - 159;
'Ё' (йо): 221;
'а' - 'п': 224 - 239
'р' - 'ю': 240 - 254
'ё': 222
'я': 223

Я правильно понял? Проблема в знании кода русского символа?
Если так, то берите соответствующую кодировку и сравнивайте введённый символ с соответствующим диапазоном. Например через cmp, или sub, или or, или xor, и т.д...:)
Выбор богатый...;-)

И ещё прошу обратить внимание, что это не "чистый" (мню scan-code) код клавиши, а уже обработанный интерфейсом, находящимся между Вами и контроллером клавиатуры. Поэтому если Вы получаете "сырые" коды (например от порта 60h), то Вам необходимо их предварительно обработать.

Удачи.

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


Вопрос № 43.315
Уважаемые эксперты!
Помогите сдать сессию!
Мне срочно нужна программа на ассемблере, которая бы складывала шестнадцатиразрядные двоичные числа, а результат выдавала в десятичной форме, т.е. (bin+bin)-->dec.
Отправлен: 17.05.2006, 12:02
Вопрос задал: Kostolom (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: Пан Павел Константинович
Здравствуйте, Kostolom!

Вот алгоритм, МНЕ он НЕ! нравиться но не чего другого в голову пока не пришло, радует тот факт что он работает!

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
;=============================================
;Инициализация регистров.
mov ax,00010010b ;a = 18
mov bx,00100101b ;b = 37
;=============================================
;Сложение a = а + b.
add ax,bx ;a = a + b
;=============================================
;Преобразование 16-го числа в 10-ое.

mov bx,0ah
xor dx,dx
xor cx,cx
@1:
div bx
cmp ax,00h
jz @@2
push dx
xor dx,dx
inc cx
jmp @@1
@2:
push dx
inc cx
xor bx,bx
@3:
pop dx
add dl,30h
mov byte ptr [ADD_R+bx],dl
inc bx
loop @@3
;=============================================
;Вывод в десятичной форме.

mov ah,09h
lea dx,ADD_R
int 21h
;=============================================
;Выход.
ret ;exit
;=============================================
;Буфер для десятичного числа.

ADD_R db 6 dup('$')

CSEG ends
end Begin

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


---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 8-ой класс)
Ответ отправлен: 18.05.2006, 01:23
Оценка за ответ: 3
Комментарий оценки:
Не совем то что надо. Нужно превод из 2-ой в десятичную, но всё равно спаибо


Вопрос № 43.382
Тут возникли проблемы с программами по ассемблеру

Собственно вот 2 штуки

1. Определить, содержит ли байт данных в кодовом сегменте в разрядах 6-2 двоичную комбинацию 11010. Если да, то сформировать код в регистре ВН следующим образом : сумма тетрад исходного байта, если значение старшейй тетрады больше младшей, разность тетрад в противном случае.
Если полученный в ВН код меньше 40, инвертировать его.

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

Все проги односегментные, т.к. потом надо делать .сом

Приложение:

Отправлен: 17.05.2006, 19:07
Вопрос задал: NooKeRRR (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

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

1. Замеченные ошибки:
а) после сравнения управление передается на метку M2, хотя логично бы на M4 (т.к. значение регистра BH в этом случае не определено).
б) перед меткой M3 нужно вставить переход на метку M2 (т.к. после того, как значение в регистре BH сформировано, его не нужно изменять согласно второго условия).

2. А что не нравиться во второй программе? Там вроде бы все правильно. Только при обращениях типа
cmp cs:[mass+SI], -20
надо ставить прямое указание на размер данных:
cmp word ptr cs:[mass+SI], -20

Но я бы написал по-другому (см. Приложение).

Приложение:

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

Ответ отправил: Ayl (статус: Академик)
Россия, Санкт-Петербург
ICQ: 5163321
----
Ответ отправлен: 18.05.2006, 14:07


Вопрос № 43.412
privet, u menya zada4ka:
napisat' prozeduru "sum". polu4aet adress ofseta na4ala matrizu iz 10 znakovuh 4isel, razmerom byte. prozedura vozvras4aet v "ax" summu^2 vseh 4isel matrizu.
stack:
sp ukazuvaet na adress vozvrata
adress ofset matizu
.......
dlya matrizu (sistema s osnovaniem 10)
1,15,-128,34,127,0,0,-17,78,12
polu4im summu:
1+225+16384+1156+16129+0+0+289+6084+144=40412
napisat tolko prozeduru.
est-li perepolnenie vo vremya vupolneniya ?

putalsya perevesti doslovno, ne znau na skolko udalos'.
spasibo zaranee.
alex
Отправлен: 18.05.2006, 00:42
Вопрос задал: Borbon1 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Пан Павел Константинович
Здравствуйте, Borbon1!

Вот код:

CSEG segment
assume cs:CSEG,ds:CSEG,ss:CSEG,es:CSEG
org 100h
Begin:
;=============================================
lea ax,Matrix
push ax ;offset матрицы Matrix
call Sum_prc ;Вызов процедуры
;=============================================
ret ;exit

;=============================================
;Процедура суммирования и возведения результата в квадрат.
Sum_prc proc
;=============================================
;Работа со стеком для извлечиния OFFSET Matrix.
pop ax
pop si
push ax
;=============================================
;Инициализация.
mov cx,0ah
xor bx,bx
xor ax,ax
xor dx,dx
;=============================================
;Последовательное считвание и сложение элементов матрицы.

@1:
mov dl,[si+bx]
add ax,dx
inc bx
loop @@1
cbw
;=============================================
;ax = сумме всех элементов матрицы.

imul ax ;sum ^ 2

;ax = ax ^ 2 (ax = ax * ax)
;=============================================
ret ;exit
Sum_prc endp
;=============================================
Matrix db 1, 6
db 2, 7
db 3, 8
db 4, 9
db 5, 10
;=============================================
CSEG ends
end Begin

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

---------
Hello Worlds
Ответ отправил: Пан Павел Константинович (статус: 8-ой класс)
Ответ отправлен: 18.05.2006, 02:58

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

Отвечу на вопрос и приведу код для получения суммы квадратов элементов матрицы (из примера вроде бы нужна она, а не квадрат суммы элементов).

Максимальная сумма квадратов получится в случае, когда все элементы будут равны -128. Тогда S=10*(-128)^2=10*16384=163840. То есть для представления суммы квадратов 16-тиразрядного беззнакового числа может и не хватить (163840>65535). То есть при заданных условиях возможно переполнение. Либо нужно использовать для возврата двойное слово.

В Приложении код процедуры. Для выхода можешь использовать один из двух вариантов:
1. Возврат двойного слова в регистрах dx:ax без переполнения
2. Проверка переполнения и возврат результата в регистре ax при отсутствии переполнения (флаг переноса (CF) сброшен) и установку флага CF при обнаружении переполнения (значение регистра ax некорректно).

Приложение:

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

Ответ отправил: Ayl (статус: Академик)
Россия, Санкт-Петербург
ICQ: 5163321
----
Ответ отправлен: 18.05.2006, 14:49


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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

В избранное