2014 dxdy logo

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

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




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

Задание 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 
Задача 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 
разобрался, спасибо

 
 
 
 Re: ассемблер
Сообщение16.02.2010, 19:57 
Код:
   .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 
gepa в сообщении #289581 писал(а):
а к ним прибавляется число 3 т.е. 36, 34 что это за тройка и что она тут делает? ....

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

 
 
 
 Re: ассемблер
Сообщение16.02.2010, 20:18 
p51x в сообщении #289583 писал(а):
gepa в сообщении #289581 писал(а):
а к ним прибавляется число 3 т.е. 36, 34 что это за тройка и что она тут делает? ....

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

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

 
 
 
 Re: ассемблер
Сообщение16.02.2010, 20:20 
gepa в сообщении #289587 писал(а):
а как тогда перейти на сами числа? поскольку тут нужна работа именно с числами, а не с их кодами...

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

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

 
 
 
 Re: ассемблер
Сообщение16.02.2010, 20:27 
venco в сообщении #283508 писал(а):
Задача 2.

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

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

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

 
 
 
 Re: ассемблер
Сообщение16.02.2010, 20:52 
gepa в сообщении #289591 писал(а):
а как вариант sub al,30h может подойти?
Да, если символ был загружен в al.

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

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


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

 
 
 
 Re: ассемблер
Сообщение24.02.2010, 22:43 
Соображения по №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 
Помогите написать код. Суть вот в чём "Вывести на экран английские буквы код которых делится на 2 и на 3". Ассемблер

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group