.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
ассемблер
Задание 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
мой код
Код:
проблема тут заключается в том что ответ -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
.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
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
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
текст для шифрования вводится в командной строке. В тексте – только прописные латинские буквы и пробелы. Удалить пробелы, заменить букву ‘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
Перевод в дополнительный код это инверсия числа (-1Ah -> FFE6h) и вычитание единицы (FFE6h -> FFE5h).
Задание 2: Ошибки-ошибки...
Во-первых, нумерация начинается с нуля, т.е. первая цифра это N[0], а четвёртая - N[3].
Во-вторых, что-то я не понимаю, как вы так пишете - N[x]. Насколько я помню из универа, в таком случае вам надо писать так: [N+x].
В-третьих, у вас в N строка, и там не сами числа, а их символы, т.е. перед тем, как делить, вам следует преобразовать символ в число, т.е. где-то так: sub AL, '0'.
В-четвёртых, при делении на 4 вы снова делите на BL, но там у вас по-прежнему 3.
Цитата: engel65536
Задание 1: У вас всё верно, так как -1Ah, переведённый в дополнительный код, будет FFE5h:
Перевод в дополнительный код это инверсия числа (-1Ah -> FFE6h) и вычитание единицы (FFE6h -> FFE5h).
Задание 2: Ошибки-ошибки...
Во-первых, нумерация начинается с нуля, т.е. первая цифра это N[0], а четвёртая - N[3].
Во-вторых, что-то я не понимаю, как вы так пишете - N[x]. Насколько я помню из универа, в таком случае вам надо писать так: [N+x].
В-третьих, у вас в N строка, и там не сами числа, а их символы, т.е. перед тем, как делить, вам следует преобразовать символ в число, т.е. где-то так: sub AL, '0'.
В-четвёртых, при делении на 4 вы снова делите на BL, но там у вас по-прежнему 3.
Перевод в дополнительный код это инверсия числа (-1Ah -> FFE6h) и вычитание единицы (FFE6h -> FFE5h).
Задание 2: Ошибки-ошибки...
Во-первых, нумерация начинается с нуля, т.е. первая цифра это N[0], а четвёртая - N[3].
Во-вторых, что-то я не понимаю, как вы так пишете - N[x]. Насколько я помню из универа, в таком случае вам надо писать так: [N+x].
В-третьих, у вас в N строка, и там не сами числа, а их символы, т.е. перед тем, как делить, вам следует преобразовать символ в число, т.е. где-то так: sub AL, '0'.
В-четвёртых, при делении на 4 вы снова делите на BL, но там у вас по-прежнему 3.
спасибо, буду дальше разбираться
Код:
.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
.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 будет в начале
Цитата: gepa
эт по задаче 2 проблема у меня в том, что в регистры заносятся не числа 6 2 6 4 которые тут, а к ним прибавляется число 3 т.е. 36, 34 что это за тройка и что она тут делает? ....
Посмотри hex-коды символов 0 1 2 3 4 5 6 7 8 9. :)
Цитата: Lerkin
Посмотри hex-коды символов 0 1 2 3 4 5 6 7 8 9. :)
понятно.. а как тогда работать с самими числами?
Цитата: gepa
понятно.. а как тогда работать с самими числами?
Ну подумай, как перевести из кода в значение.
Пример: имеем для 6-ки код 36h. Что-то и откуда-то нужно вычесть? ;) Или упаковать.
З.Ы. В задание не вдавался, отвечаю строго на вопросы :)
Цитата: Lerkin
Ну подумай, как перевести из кода в значение.
Пример: имеем для 6-ки код 36h. Что-то и откуда-то нужно вычесть? ;) Или упаковать.
З.Ы. В задание не вдавался, отвечаю строго на вопросы :)
Пример: имеем для 6-ки код 36h. Что-то и откуда-то нужно вычесть? ;) Или упаковать.
З.Ы. В задание не вдавался, отвечаю строго на вопросы :)
спасибо, как вариант очень даже может подойти
mov al,d[0]
sub al,30
mov bl,3
в al получилось 18 ... даже вычесть не смог нормально ..
проехали, забыл h дописать))
все еще нужно помощь по 4-ой л/р ....:confused:
- количество элементов равных 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
помогите,плизззз((((((((