С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
1

Упростить план реализации программы на TASM ассемблере

20.04.2012, 17:20. Показов 1508. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание. Зашифровать строку по таблице. Таблица считается известной.
В моем понимании я должен:
1) в сегменте данных задать строку A B C D E .... и так весь англ алфавит
2) задать строку Z X V C D A .... буквы англ алфавита стоящие в порядке не соответствующем порядку англ алфавиту.
3) реализовать ввод с клавиатуры произвольного массива D C R T....
4) подпрограмма будет искать в 1 массиве позицию буквы из введенного массива( пример D ищем ее позицию в первом массиве это номер 4)
5) нужно из второго массива извлечь букву с позиции (по моему примеру из позиции 4 т.е буква С)
6) сохранить эту букву в новом массиве на позиции 1 так как в веденном массиве D стоит на первой позиции или наверное лучше перезаписать ее на место D в веденном массиве
7) и так с каждой введенной буквой
Пожалуйста напишите как можно упростить мой план действий который я буду реализовывать на Tasm ассемблере.( опыт программирования очень маленький)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.04.2012, 17:20
Ответы с готовыми решениями:

Вычислить выражение y=c/4-62d/a2+1 на ассемблере tasm
y=c/4-62d/a2+1

Ребят. Хочу научиться программировать на ассемблере и составил план
Вот: сперва буду писать для DOS , потом постепенно перейду на windows 32 bit, потом 64 бита, потом...

Шифр файла на ассемблере (TASM). Интересный алгоритм)
Необходимо написать программу шифрования/дешифрования файла в соответствии с заданным ключом....

Установить план производства изделий А и В, обеспечивающий максимальный доход от реализации
Завод выпускает изделия двух типов: А и В. При этом используется сырьё четырёх видов. Расход сырья...

19
Заблокирован
20.04.2012, 18:50 2
Да, собственно, никак...
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
20.04.2012, 19:37 3
Искандар, не-а. В общем случае рисуем массив на 256 кодов и по нему делаем xlatb... без в/в всего-то
Assembler
1
2
3
4
5
6
7
8
; ds:si -> inp buf
; es:di -> out buf
; es:bx -> table
;cx - counter
@@: lodsb
xlatb
stosb
loop @B
0
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
20.04.2012, 20:15  [ТС] 4
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Искандар, не-а. В общем случае рисуем массив на 256 кодов и по нему делаем xlatb... без в/в всего-то
Assembler
1
2
3
4
5
6
7
8
; ds:si -> inp buf  
; es:di -> out buf
; es:bx -> table
;cx - counter
@@: lodsb
xlatb
stosb
loop @B
Пожалуйста объясните на пальцах что да как я очень плохо разбираюсь в ассемблере не разу с цепочками только с числами.

; ds:si -> inp buf это строка источник в ней будет ?
; es:di -> out buf строка приемник в ней будет ?
; es:bx -> table это походу строка(таблица) для xlatb в ней будет
сделай очень прошу развернутые коменты к строкам кода.
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
20.04.2012, 20:35 5
; ds:si -> inp buf это строка, вводимая с клавиатуры, п. 3)
; es:di -> out buf закодированная строка, п. 6)
; es:bx -> table это таблица перекодировки, пп. 4), 5)
; cx - длина строки
0
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
20.04.2012, 20:41  [ТС] 6
Цитата Сообщение от Charles Kludge Посмотреть сообщение
; ds:si -> inp buf это строка, вводимая с клавиатуры, п. 3)
; es:di -> out buf закодированная строка, п. 6)
; es:bx -> table это таблица перекодировки, пп. 4), 5)
; cx - длина строки
спасибо стало намного понятнее
0
Заблокирован
20.04.2012, 21:58 7
Charles Kludge, Точно!!! Чот подзабыл про неё хорошая штука однако И содержимое регистров ей вывести можно!
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
21.04.2012, 06:23 8
Объясните, пожалуйста, какие регистры надо заполнять для команды xlat. Давненько писал программу с этой коммандой. А сейчас совершенно не помню, как она работает.
0
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,704
21.04.2012, 07:55 9
programmisto, у тебя Google отключен?
XLAT =Table looK-up tranSLATion - Табличное преобразование
выполнение команды флаги не изменяет
КодКомандаОписаниеПроц.Пример
D7XLAT m8AL = DS:[(E)BX + AL]8086xlat ES:[ebx]
D7XLATBAL = DS:[(E)BX + AL]8086xlatb
Псевдокод:
IF AddresSize = 16
THEN
AL = DS:[BX + ZeroExtend(AL)];
ELSE (* AddressSize = 32 *)
AL = DS:[EBX + ZeroExtend(AL)];
FI;
Описание:
Команда XLAT, используя индекс из регистра AL, выбирает элемент из таблицы, расположенной в памяти по адресу DS: (E)BX, и помещает его в AL. Регистр AL должен содержать беззнаковый индекс элемента в таблице. Сама таблица адресуется регистровой парой DS:BX (для атрибута размера адреса равного 16 бит), или регистровой парой DS: EBX (для атрибута размера адреса равного 32 бита).
Для операнда команды XLAT допускается замещение сегмента по умолчанию.
Мнемоника XLATB является синонимом XLAT и используется для краткости, а также для того, чтобы показать размерность операции выборки (байт)

Иногда вместо арифметических и логических преобразований выгоднее использовать преобразование одного кода в другой. Преобразование кода длиной не более 8 бит (всего 256 комбинаций) наиболее просто реализуется с помощью хранения выходных кодов в массиве длиной до 256 байт и использования исходного кода в качестве индекса в этом массиве. В микропроцессоре предусмотрена специальная команда для выполнения этих действий – команда XLAT. В команде XLAT предполагается, что базовый адрес массива байт находится в регистре EBX, а преобразуемый байт – в регистре AL. Преобразуемое значение кода берется из массива кода и помещается в регистр AL.
Фрагмент программы, преобразующей двоичный код в код семисегментного индикатора:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
;семисегментный код для шестнадцатеричных чисел 
TABLE_CIF DB 3Fh,06h,5Bh,4Fh,66h,6Dh,7Dh,07h
DB 7Fh,6Fh,77h,7Ch,39h,5Eh,79h,71h
MOV EBX,OFFSET TABLE_CIF ;загрузить базовый адрес 
MOV ESI,OFFSET STG_BCD ;указать цепочку источник
MOV EDI,OFFSET STG_DISPL;указать цепочку приемник
MOV ECX,LENGTH STG_BCD
NEXT: LODSB ;получить цифру в AL
AND AL,0Fh ;отсекаем “лишнее”
XLAT ;преобразовать в код индикатора
STOS  ;значение в AL отправить на индикатор
LOOP NEXT ;повторяем до завершения
Фрагмент программы преобразования шестнадцатеричной цифры в ASCII-код. Процедура display выводит число на экран, само число уже в регистре EAX.
Assembler
1
2
3
4
5
6
7
.data
Table db ‘0123456789ABCDEF’
.code
mov ebx,offset Table
and al,0Fh
xlat
call display
Если вы заранее построили таблицу соответствий, команду XLAT можно использовать для быстрого деления/умножения на определенный коэффициент, возведения в степень, получения квадратного или кубического корня, фильтрации сигнала, шифрования/дешифрации и т.п.
Несмотря на свою привлекательность, XLAT ограничена размером регистра AL и может преобразовывать код длиной не более 8 бит (всего 256 комбинаций). Чтобы преодолеть это ограничение, XLAT можно имитировать командами:
lea reg,[base+reg*scale+offset]
или
mov reg,[base+reg*scale+offset]
1
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
21.04.2012, 14:59  [ТС] 10
Прошу не ругайтесь понимаю написал чушь, но может все же поможете добить задачу вот что получилось TASM через дос бокс. Помогите кто чем сможет ( всему рад советам что дописать что переписать, кодам короче все что поможет буфер еще где-то надо задействовать=) В поисковиках искал но для exe и tasm примеров команд очень мало=((

Код
code segment public
assume cs:code, ds:data, ss: stek
start: mov ax,data 		        ; настроим на начало сегмента данных
	mov ds,ax				;сохранение начального адреса сегмента данных в регистр ds
	mov es,ax 				; es - тот же сегмент данных 
		  				; (для команд обработки цепочек)
	mov dx,offset strA 		; вывод строки 'Введите строку'
	mov ah,9				;запись номера функции вывода строки
	int 21h;прерывание
	mov dx,offset str1 			;сохранение адреса выделенной области памяти под строку
	mov ah,0Ah 				;запись номера функции ввода строки
	int 21h					;прерывание
	
	MOV BX,OFFSET Table_k 	  ;таблица перекодировки 
	MOV SI,OFFSET Str1              ;указать цепочку источник
	MOV DI,OFFSET strR              ;истинная таблица
	MOV CX,LENGTH Str1             ; длина строки
	@@: lodsb
	xlatb
	stosb
	loop @@
	
code ends;конец кода программы

data segment public;сегмент данных

str1 db 26,0; выделение памяти под строку 
strbuf db 256 dup (?); задание буфера
strA db 'Input String',13,10,'$';строка «Введите строку»
Table_k db '7Ah,78h,76h,63h,62h,61h,64h,66h,67h,65h,68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh,6Fh,70h,71h,72h,73h,74h,75h,77h,79h'; таблица перекодировки
strR db '61h,62h,63h,64h,65h,66h,67h,68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh,6Fh,70h,71h,72h,73h,74h,75h,76h,77h,78h,79h,7Ah'; истенная таблица

strend db 13,10,'$';переход на новую строку

data ends;конец сегмента данных
Stek segment stack;сегмент стека
dw 128 dup (?)
Stek ends ;конец сигмента стека 
end Start ; конец программы
0
Заблокирован
22.04.2012, 15:35 11
Для ввода строки нужен массив. Str1 db 26,0 - это не буфер для ввода, это просто переменная размером два байта. Массив нужно объявить так: str1 db 26 dup (0).
Команда xlatb заменяет символ в аl на символ в таблице. Из задания ясно, что у вас будут две таблицы: 1) весь алфавит целиком и 2) алфавит "вперемешку". Для корректного кодирования придется использовать xlatb 2 раза.
mov bx, offset table1
xlatb
mov bx, offset table2
xlatb
Где табл1 - оригинальный алфавит, табл2 - ваш набор символов.

Добавлено через 22 часа 46 минут
вот оно мое творение:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
.model small
.stack 256
.data  
    out_str db 255 dup ('$')
    tabl1 db 'abcdefghijklmnopqrstuvwxyz'
    table2 db 'zyxwvutsrqponmlkjihgfedcba'
.code
start: 
    mov ax, @data
    mov ds, ax
    mov es, ax
 
    mov cx, 255
    mov di, offset out_str
@@1:
    mov ah, 1
    int 21h
    cmp al, 0dh
    je write
    sub al, 61h
    mov bx, offset tabl1
    xlat
    mov bx, offset table2
    sub al, 61h
    xlat
    stosb
    loop @@1
write:
    mov ah, 9
    mov dx, offset out_str
    int 21h
    mov ax, 4c00h
    int 21h
    
end start
1
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
22.04.2012, 17:27 12
А зачем использовать дважды. Можно вычесть 64 и переводить по второй таблице и все (то есть не используя Table1)
0
Заблокирован
22.04.2012, 18:37 13
Цитата Сообщение от programmisto Посмотреть сообщение
вычесть 64
не 64, а 61.
Цитата Сообщение от programmisto Посмотреть сообщение
Можно вычесть 64 и переводить по второй таблице и все (то есть не используя Table1)


Добавлено через 1 минуту
хотя у halif в задании стоит
Цитата Сообщение от halif Посмотреть сообщение
1) в сегменте данных задать строку A B C D E .... и так весь англ алфавит
2) задать строку Z X V C D A .... буквы англ алфавита стоящие в порядке не соответствующем порядку англ алфавиту.
т.е. две строки, т.е. две таблицы, у меня все верно!
0
3 / 3 / 0
Регистрация: 04.04.2012
Сообщений: 26
22.04.2012, 23:03  [ТС] 14
да
programmisto, прав одной таблица хватит для кодировки но вот вычитать все таки надо 61 а не 64 хотя пока понял это только опытным путем (вычитал 61 и 64 ) но и логически думаю пойму=))
0
155 / 125 / 3
Регистрация: 22.06.2011
Сообщений: 1,784
22.04.2012, 23:36 15
halif, хорошо хоть понял
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
23.04.2012, 09:32 16
Это ещё почему? Нашел кодировку Windows. Вот че там написано:

61 - =
62 - >
63 - ?
64 - @
65 - A
и т. д.
А с шестидесяти пяти начинаются крупные английские буквы.
0
Заблокирован
23.04.2012, 10:02 17
programmisto, В винде кодировка ASCII, а твоя находка - даже не знаю где ты её взял.
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
23.04.2012, 14:11 18
В книге "Справочник школьника: 5-11 классы. Информатика". А проверить я проверю.

Добавлено через 5 минут
Под ДОСом написал вывел символ с кодом 65, он у меня английскую A вывел.
0
Ушел с форума
Автор FAQ
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,704
23.04.2012, 14:13 19
programmisto, буквы не английские (немецкие, французские и т.п.), а латинские

Искандар, а для чего две таблицы? заводишь одну на 256 символов и на место с номером 41h (символ "A") ставишь символ "Z" и т.п.
0
Заблокирован
23.04.2012, 14:58 20
Mikl___, Я по ходу задание неправильно понял halif предположил что надо две строки делать, а я подумал, что надо иненно двумя строками делать
0
23.04.2012, 14:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2012, 14:58
Помогаю со студенческими работами здесь

План программы
Предвидится работа над курсовой по ЯП, C++ дается мне довольно тяжело, но пользоваться гуглом для...

Проверка программы TASM
Проверьте пожалуйста работает ли программа, ату у меня пишет 16bit MS-DOS Subsystem model small ...

Неправильный код программы на TASM
Здравствуйте. Вот дан текст программы на DEBUG: -a Есть и код на TASM этой программы, но он...

Программы на Ассемблере
Всем доброго времени суток, помогите в решении задачек на Ассемблере. Есть пример решения одной...

Компиляция и запуск программы в GUI TASM
Здравствуйте. Скачал турбо ассемблер 64 вот с этой ссылки...

Заголовок для программы транслятор tasm
пожалуйста знающие знатоки исправьте меня если я не прав и поясните мне последнюю строку prg...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru