Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ассемблер

37K
25 января 2010 года
gepa
16 / / 22.12.2008
нужна помощь в решении задач, сразу оговорюс что разбираюсь в ассемблере плохо

Задание 1

вычислить v=(-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
24K
25 января 2010 года
engel65536
50 / / 17.10.2007
Задание 1: У вас всё верно, так как -1Ah, переведённый в дополнительный код, будет FFE5h:
Перевод в дополнительный код это инверсия числа (-1Ah -> FFE6h) и вычитание единицы (FFE6h -> FFE5h).

Задание 2: Ошибки-ошибки...
Во-первых, нумерация начинается с нуля, т.е. первая цифра это N[0], а четвёртая - N[3].
Во-вторых, что-то я не понимаю, как вы так пишете - N[x]. Насколько я помню из универа, в таком случае вам надо писать так: [N+x].
В-третьих, у вас в N строка, и там не сами числа, а их символы, т.е. перед тем, как делить, вам следует преобразовать символ в число, т.е. где-то так: sub AL, '0'.
В-четвёртых, при делении на 4 вы снова делите на BL, но там у вас по-прежнему 3.
37K
27 января 2010 года
gepa
16 / / 22.12.2008
Цитата: engel65536
Задание 1: У вас всё верно, так как -1Ah, переведённый в дополнительный код, будет FFE5h:
Перевод в дополнительный код это инверсия числа (-1Ah -> FFE6h) и вычитание единицы (FFE6h -> FFE5h).

Задание 2: Ошибки-ошибки...
Во-первых, нумерация начинается с нуля, т.е. первая цифра это N[0], а четвёртая - N[3].
Во-вторых, что-то я не понимаю, как вы так пишете - N[x]. Насколько я помню из универа, в таком случае вам надо писать так: [N+x].
В-третьих, у вас в N строка, и там не сами числа, а их символы, т.е. перед тем, как делить, вам следует преобразовать символ в число, т.е. где-то так: sub AL, '0'.
В-четвёртых, при делении на 4 вы снова делите на BL, но там у вас по-прежнему 3.



спасибо, буду дальше разбираться

37K
16 февраля 2010 года
gepa
16 / / 22.12.2008
Код:
.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 будет в начале
9
16 февраля 2010 года
Lerkin
3.0K / / 25.03.2003
Цитата: gepa

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


Посмотри hex-коды символов 0 1 2 3 4 5 6 7 8 9. :)

37K
16 февраля 2010 года
gepa
16 / / 22.12.2008
Цитата: Lerkin
Посмотри hex-коды символов 0 1 2 3 4 5 6 7 8 9. :)



понятно.. а как тогда работать с самими числами?

9
16 февраля 2010 года
Lerkin
3.0K / / 25.03.2003
Цитата: gepa
понятно.. а как тогда работать с самими числами?


Ну подумай, как перевести из кода в значение.
Пример: имеем для 6-ки код 36h. Что-то и откуда-то нужно вычесть? ;) Или упаковать.

З.Ы. В задание не вдавался, отвечаю строго на вопросы :)

37K
16 февраля 2010 года
gepa
16 / / 22.12.2008
Цитата: Lerkin
Ну подумай, как перевести из кода в значение.
Пример: имеем для 6-ки код 36h. Что-то и откуда-то нужно вычесть? ;) Или упаковать.

З.Ы. В задание не вдавался, отвечаю строго на вопросы :)



спасибо, как вариант очень даже может подойти

mov al,d[0]
sub al,30
mov bl,3
в al получилось 18 ... даже вычесть не смог нормально ..

проехали, забыл h дописать))


все еще нужно помощь по 4-ой л/р ....:confused:

78K
11 декабря 2011 года
ruzmars
1 / / 07.12.2011
помогите пожалуйста переделать программу так чтобы она подсчитывала:

- количество элементов равных 4;
- произведение отрицательных чисел
st_s SEGMENT PARA STACK 'STACK' ;стэк
DB 64 DUP (?)
st_s ENDS
dt_s SEGMENT PARA PUBLIC 'DATA' ;переменные
mass DW 9,-4,2,3
summa DW 0
proiz DW 1
N_mass DW 4 ;количество элементов
cur DW 0 ; переменная для перемещения по массиву
Vyvod Db ' summa - ','$'
Vyvod0 Db ',proizvedenie - ','$'
dt_s ENDS

cod_s SEGMENT PARA PUBLIC 'CODE'

BEGIN PROC FAR
ASSUME CS: cod_s, DS: dt_s, SS:st_s
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,dt_s
MOV DS,AX ; инициализация программы

MOV CX,N_mass ; счетчик кол-ва элементов
MOV AX,offset mass ; процедура получает адрес массива
MOV cur, AX

LOOP_N: ; цикл переборки элементов массива
MOV BX,cur
MOV AX, [BX] ; ах получает значение элемента по адресу вх
cmp AX,4 ; если больше 4,то отпраляемся на вычисленние суммы
JG j_sum
CMP AX,1 ; если число положительно ( больше или равно 1 ),
;то отпраляемся на вычисление произведения
JGE j_proiz
JMP j_end
j_sum:
ADD summa,AX

j_proiz:
MUL proiz
MOV proiz,AX
j_end:
ADD cur,2 ; т.к. слово - 2 байта, шаг смещения равен 2
LOOP LOOP_N

mov ah,09 ;вывод на экран результатов
lea dx,vyvod ;вывод строки
int 21h
mov ax,summa ; заносим числов регистр для обработки на вывод
vyvod1: xor cx, cx ; Количество цифр будем держать в CX.
mov bx, 10 ; основание сс. 10 для десятеричной
push ax ; заносим в стэк для проверки
vyvod2:
xor dx,dx ; обнуляем остаток
div bx ; Делим число на основание сс.В остатке получается последняя цифра.
push dx ; записываем в стэк
inc cx ; засчитываем одну цифру
test ax, ax ;повторяем до тех пор, пока остаток от деления будет больше 0
jnz vyvod2
mov ah, 02h ;Теперь приступим к выводу.
vyvod3:
pop dx ;Извлекаем очередную цифру, переводим её в символ и выводим.
add dl, '0'
int 21h ;Повторим ровно столько раз, сколько цифр насчитали.
loop vyvod3
pop ax
cmp ax,proiz ;сравниваем было ли ах начением произведения
je exit ;Если да, то выходим

mov ah,09 ;Если нет, то выводим произведение
lea dx,vyvod0
int 21h
mov ax,proiz
jmp vyvod1
exit:
RETF

BEGIN ENDP
cod_s ENDS
END BEGIN

помогите,плизззз((((((((
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог