2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Два упражнения. Вычисление выр., деление и перестанов. [asm]
Сообщение25.01.2010, 20:46 


30/04/09
35
нужна помощь в решении задач, сразу оговорюсь, что разбираюсь в ассемблере плохо

Задание 1

вычислить $ \frac {-y+x(3z+1)} {z-2}$
y,z –байты, x,v –слова

Наборы:
X=-2h, y=7h, z=3h, v=-1Ah
X=FBEh, y=56h, z=-7Fh, v=2E60h

мой код

Код:
.model small
.stack 100h
.data
   var_x dw -2h
   var_y db 7h
   var_z db 3h
   var_v dw ?
.code
prog_a2:
   mov ax, @data ;
   mov ds, ax ;

   mov al, var_z ; копируем z в al
   cbw ; преобразование байта al в слово ax
   mov bx,3 ;
   imul bx ; умножаем 3*z
   inc ax ; 3z+1
   imul var_x ; x*(3*z+1)
   sub bx,bx ; очиищаем
   mov bl, var_y ; помещаем значение у
   cbw ;
   sub ax, bx ; -y+x*(3*z+1)
   adc dx,0 ; вычисляем старшее число числителя
   mov bx,ax ; копируем значение -y+x*(3*z+1)
   mov al, var_z ;
   cbw ;
   sub ax,2 ; вычитаем z-2
   xchg ax,bx ; меняем местами
   idiv bx ; делим
   mov var_v, ax ;
end prog_a2


проблема тут заключается в том что ответ -1Ah, т.е. FFE6h а у меня получается FFE5h

Задание 2.

Формулировка:

Дана строка из четырех десятичных цифр. Если первая цифра делится на 3, а четвертая нет, то увеличить третью цифру (кроме «9») на 1, иначе поменять местами вторую и четвертую

алгоритм:
Если первая цифра делится на 3, а четвертая нет
То увеличить третью цифру на 1
Если третья цифра равна 9 ничего не делаем
Иначе поменять местами вторую и четвертую

вот что получилось у меня

Код:
.model small
.stack 100h
.data
   N   db   '3321'
.code
prog_a3:   
      mov ax, @data
      mov ds, ax
      
      sub ax,ax
      mov al,N[1]; в этом блоке проверяю делимость на 3 первой цифры, если нет остатка значит разделилось
      mov bl,3;
      idiv bl;
      cmp ah,0;
      jne X;
      
      mov al,N[4]; проверяем делимость 4-ой цифры
      idiv bl
      cmp ah,0
      je X
      
      mov bl,9; этот блок проверяет является ли эта цифра девяткой
      mov bh, N[3]
      cmp bl,bh
      je X
      inc bh
      jmp EXIT
      
X:
      mov al,N[2] ; в этом блоке меняем местами 2-ю и 4-ю цифру
      mov ah,N[4]
      xchg al,ah
      jmp EXIT

EXIT:
      nop
end prog_a3

тут основная проблема в том, что запутался я в этих командах перехода(

Задание 3.
Даны массивы А и В из 16 байтов. Сосчитать количество равных элементов с одинаковыми порядковыми номерами (и дающих при делении на 3 остаток 2) и скопировать адреса (смещения) таких элементов в массив С

тут вообще у меня глухо...

Задание 4.

Текст для шифрования вводится в командной строке. В тексте – только
прописные латинские буквы и пробелы. Зашифровать текст в соответствии с таблицами (каждая буква заменяется на три строчные буквы: номер строки, номер столбца; пробел кодируется как brd). Пример: слово CRAB заменяется на xpwypcxpuxpv. В программе должны быть одна или две подпрограммы для шифрования символа (или группы символов). Попытаться «угадать» закон, по которому шифруются символы, а не шифровать каждый символ по отдельности.

вот эти 2 таблицы по которым шифруются буквы

Код:
x   u   v   w   x
p   A   B   C   D
q   E   F   G   H
r   I   J   K   L
s   M   N   O   


Код:
y   a   b   c   d
p   P   Q   R   S
q   T   U   V   W
r   X   Y   Z   
s



Код:
у меня есть код похожей программы

текст для шифрования вводится в командной строке. В тексте – только прописные латинские буквы и пробелы. Удалить пробелы, заменить букву ‘J’ на букву ‘I’ и зашифровать текст в соответствии с таблицей.
   1   2   3   4   5
1   A   B   C   D   E
2   F   J   H   I   K
3   L   M   N   O   P
4   Q   R   S   T   U
5   V   W   X   Y   Z

Текст программы:

        .MODEL small
        .STACK 100h
        .DATA
text   DB 83 DUP(?)
msg1 DB "No text",0dh,0ah,'$'
msg2 DB "Non allowed symbols",0dh,0ah,'$'
         .CODE
;-----------------------------------------------------------
; Подпрограмма шифровки символа
; Вход: AL – код символа
; Выход: AХ – код зашифрованного символа
;-----------------------------------------------------------
encode PROC
         cmp al,'A'   ;   Если код символа не ниже кода ‘A’
         jb error
         cmp al,'Z'    ;   и не выше кода ‘Z’,
         ja error
         cmp al,'J'     ;   проверить, является ли символ буквой J,
         jae z
         jmp s
         z:cmp al,'J' 
         je r
         dec al
         jmp s
r:      mov al,'I'   ;   если является, то заменить его на букву I.
s:      sub al,'A'   ;   Получить код символа, начиная с 0.
;
;  Вычисление нового кода по формуле ‘код’/5, в AL – 1-я цифра кода, в AH – 2-я.
         mov ah,0
         mov bl,5
         div bl
         mov bx,ax
         mov al,bh     ;   Частное помещаем в AL.
         mov ah,bl     ;    Остаток от деления – в AH.
         add ah,'1'      ;    Увеличиваем на 1 содержание AH
         add al,'1'       ;     и AL.
         xchg al,ah     ;    Меняем местами содержимое AH и AL.
          clc                  ;    Нормальное завершение.
          ret
error: stc                  ;     На входе символ, отличный от прописной латинской буквы
          ret
encode ENDP

start: mov ax,@data
         mov ds,ax
; Копирование цифр из хвоста командной строки в строку для обработки
         mov cx,0
         mov cl,es:[80h] ;   Длина хвоста командной строки в CX.
         jcxz empty        ;    Если хвост пустой – на empty.
        dec cx                ;     Не нужно учитывать начальный пробел.
        mov si,82h         ;    Смещение хвоста – в SI.
        mov di,OFFSET text  ;  Указатель для новой строки – в DI.
;
; Цикл обработки элементов строки
n:     mov al,es:[si]     ;     Очередной символ хвоста – в AL
        cmp al,' '             ;     Если встретился пробел,
        je cont                ;      то пропустить его,
        call encode         ;      а символ – зашифровать
        jc no_A_Z          ;     Переход, если встретился недопустимый символ
        mov [di],ax        ;      Поместить зашифрованный символ в строку-приемник
        inc di                  ;      Переместить указатель
        inc di                  ;      в строке-приемнике
cont: inc si                  ;      Переместить указатель в исходной строке
         loop n
;
;  Поместить в строку приемник символы ВК и ПС, а также терминатор
         mov word ptr [di],0a0dh
         inc di
         inc di
         mov byte ptr [di],'$'
;
;  Вывод итоговой строки на экран
         mov dx,OFFSET text
         mov ah,9h
         int 21h
         jmp short fin
;
;  Вывод сообщений об ошибках
empty: mov dx,OFFSET msg1
         mov ah,9h
         int 21h
         jmp short fin
no_A_Z: mov dx,OFFSET msg2
         mov ah,9h
         int 21h
;
;  Завершение работы программы
fin:   mov ax,4c00h
         int 21h
END start




 Профиль  
                  
 
 Re: ассемблер
Сообщение25.01.2010, 20:49 
Заслуженный участник


04/05/09
4587
Задача 1.

Что-то формула от $v$ не зависит. Так и было задумано?
Понял, $v$ - это результат.

1. Инструкция cbw нужна только если надо расширить со знаком al -> ax.
Во втором случае вы хотели сделать преобразование bl -> bx, и cbw совершенно не поможет. В вашем случае, если $y$ точно со знаком, придётся временно переместить младшее слово произведения из ax в другой регистр и расширять $y$ через al -> ax.

2. После инструкции sub перенос в старшем слове надо учитывать инструкцией sbb (subtruct with borrow), а не adc, как у вас.

-- Пн янв 25, 2010 13:05:09 --

Задача 2.

Во первых, проверять делимость надо значения цифр, а не их кода. Т.е. перед проверкой надо вычитать 48 - код '0'. При сравнении с девяткой - тоже.
Переходы почти правильные, только после проверки на девятку, наверно переставлять цифры не надо, т.е. прыгать не на X, а на EXIT.

Остальные задачи всё же попытайтесь решить.

В задаче 3 придётся использовать индексную адресацию и счётчик циклов, а также ещё один регистр, например, di для сохранения в массив C. Можно для этого задействовать команду stosw, только надо не забыть проинициализировать и регистр сегмента es.

В задаче 4 сначала определите закон шифрования.

 Профиль  
                  
 
 Re: ассемблер
Сообщение27.01.2010, 16:25 


30/04/09
35
разобрался, спасибо

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 19:57 


30/04/09
35
Код:
   .MODEL small
   .STACK 100h
   .DATA
   
d   db   "6264";,0Dh,0Ah,'$'
.CODE
start:   mov ax, @data
   mov ds, ax
      
      ;mov dx,OFFSET d
      
      
      xor ax,ax
      mov al,d[0]
      mov bl,3
      idiv bl
      cmp ah,0
      jne X
      
      xor ax,ax
      mov al,d[3]
      idiv bl
      cmp ah,0
      je X
      
      xor ax,ax
      mov al,d[2]
      mov bl,9
      cmp al,bl
      je EXIT
      inc al
      mov d[2],al
      jmp EXIT
      
X:
      xor ax,ax
      mov al,d[1]
      mov ah,d[3]
      mov d[1],ah
      mov d[3],al
      ;xchg al,ah
      jmp EXIT

EXIT:
      mov dx,OFFSET d
      int 21h
      mov ax,4C00h
      nop
      
      
   END start


эт по задаче 2 проблема у меня в том, что в регистры заносятся не числа 6 2 6 4 которые тут, а к ним прибавляется число 3 т.е. 36, 34 что это за тройка и что она тут делает? ....

по задаче 4
предложен вариант шифрования (буква-40h)mod4
в принципе можно предположить, что частное и осток связываются с номером строки и столбца...
но как тогда быть со второй таблицей поскольку каждая буква кодируется тремя символами -
номер таблицы - 78hили 79h далее второй символ меняется всегда от 70h до 73h, а вот тертий символ для первой таблицы он меняется от 75h до 78h, а для второй таблицы от 61h до 63h
и как можно определять какой символ какой таблице принадлежит - 78h или 79h будет в начале

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 20:07 


06/04/09
156
Воронеж
gepa в сообщении #289581 писал(а):
а к ним прибавляется число 3 т.е. 36, 34 что это за тройка и что она тут делает? ....

Посмотрите коды 6-ки и 4-ки в таблице символов и поймите, что вы вводите не число, а символы с опред. кодом.

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 20:18 


30/04/09
35
p51x в сообщении #289583 писал(а):
gepa в сообщении #289581 писал(а):
а к ним прибавляется число 3 т.е. 36, 34 что это за тройка и что она тут делает? ....

Посмотрите коды 6-ки и 4-ки в таблице символов и поймите, что вы вводите не число, а символы с опред. кодом.

а как тогда перейти на сами числа? поскольку тут нужна работа именно с числами, а не с их кодами...

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 20:20 
Заслуженный участник


04/05/09
4587
gepa в сообщении #289587 писал(а):
а как тогда перейти на сами числа? поскольку тут нужна работа именно с числами, а не с их кодами...

venco в сообщении #283508 писал(а):
Задача 2.

Во первых, проверять делимость надо значения цифр, а не их кода. Т.е. перед проверкой надо вычитать 48 - код '0'.

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 20:27 


30/04/09
35
venco в сообщении #283508 писал(а):
Задача 2.

Во первых, проверять делимость надо значения цифр, а не их кода. Т.е. перед проверкой надо вычитать 48 - код '0'.

а как это сделать? .... я плохо разбираюсь в ассемблере..понятно что вот так я думаю что бред " sub 48, '0' ? "

а как вариант sub al,30h может подойти?

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 20:52 
Заслуженный участник


04/05/09
4587
gepa в сообщении #289591 писал(а):
а как вариант sub al,30h может подойти?
Да, если символ был загружен в al.

 Профиль  
                  
 
 Re: ассемблер
Сообщение16.02.2010, 21:45 


30/04/09
35
venco в сообщении #289601 писал(а):
gepa в сообщении #289591 писал(а):
а как вариант sub al,30h может подойти?
Да, если символ был загружен в al.

как раз там и находится


p.s. все еще нужна помощь по 4-ой л/р ..... :?

 Профиль  
                  
 
 Re: ассемблер
Сообщение24.02.2010, 22:43 


22/02/10
7
Соображения по №4 на условном C-псевдокоде (sym - очередная литера входного потока больших латинских букв):
Код:
if sym < 'J' {
   // мы в первой таблице
   output 'x'
   // т.к. в строках таблиц по четыре литеры, то можно вычислить №№ строки nl и столбца nc
   // (нумерация от 0)
   nl = (sym - 'A') % 4
   nc = (sym - 'A') - nl*4
   output 'p'+nl
   output 'u'+nc
}
else {
   // мы во второй таблице
   output 'y'
   nl = (sym - 'P') % 4
   nc = (sym - 'P') - nl*4
   output 'p'+nl
   output 'a'+nc
}

 Профиль  
                  
 
 Re: ассемблер
Сообщение27.05.2013, 17:30 


27/05/13
1
Помогите написать код. Суть вот в чём "Вывести на экран английские буквы код которых делится на 2 и на 3". Ассемблер

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group