Консультация № 174984
07.12.2009, 15:46
0.00 руб.
0 8 1
Здравствуйте! Помогите, пожалуйста, составить 2 программки на турбо ассемблере.

1. Дан массив из десяти знаковых чисел (слов или байт). Требуется: Поменять местами пары соседних чисел. Массив слов.

2. Рассматривая байт как набор логических значений x7 x6 x5 x4 x3 x1 x0 (true -1, false - 0), вычислить логическую формулу
f=(x7 & x6 & x3 ) V (x6 & x4 & x2 & x1) V (x7 & x6 & x2 & x0)

Обсуждение

давно
Посетитель
7438
7205
08.12.2009, 12:35
общий
это ответ
Здравствуйте, nomersy.
Обе программки сведены в одну.
Что непонятно, спрашивайте
PS Сделано под формат COM, т.е. запускаем:
tasm pr
tlink pr /t

Приложение:
.model tiny
.data
array dw 0,1,2,3,4,5,6,7,8
len equ ($-array)/2

.code
.startup
;задача 1
lea si, array ;адрес массива
mov cx, len ;число элементов
call change
;задача 2
mov al,56h ;анализируемое число
call formula

.exit 0

change proc
shr cx, 1 ;число пар, если нечетное число, то последнее не рассматриваем
CLoop:
mov ax, [si] ;меняем местами
xchg ax, [si+2]
mov [si], ax
add si, 4 ;на следующую пару
loop CLoop
ret
change endp

;Сначала выделяем нужные биты по маске и сравниваем на совпадение с маской (только тогда & даст 1)
;если встретим любое равенство, то по логическому "или" будем иметь 1
;возвращает в al 0 или 1
formula proc
mov ah, al
and al, 11001000b ;x7 & x6 & x3
cmp al, 11001000b
je formula_reply
mov al, ah
and al, 01010110b ;x6 & x4 & x2 & x1
cmp al, 01010110b
je formula_reply
mov al, ah
and al, 11000101b ;x7 & x6 & x2 & x0
cmp al, 11000101b
formula_reply:
;у 386 есть замечательная команда sete...
mov al, 0
jnz formula_ret
mov al, 1
formula_ret:
ret
formula endp

end
5
Огромное спасибо!!!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
09.12.2009, 23:10
общий
Лысков Игорь Витальевич:
спасибо Вам огромное, что не остались равнодушным к моей просьбе. Но всё же это не совсем то:( Задания абсолютно разные и т.к. я слабо разбираюсь в ассемблере, мне трудно теперь из одного решения составить 2. Не могли бы Вы написать к каждому заданию отдельную программу?
давно
Посетитель
7438
7205
10.12.2009, 00:35
общий
Как скажете...
Задача 1:
Код:
	.model	tiny
.data
array dw 0,1,2,3,4,5,6,7,8
len equ ($-array)/2

.code
.startup
;задача 1
lea si, array ;адрес массива
mov cx, len ;число элементов
call change

.exit 0

change proc
shr cx, 1 ;число пар, если нечетное число, то последнее не рассматриваем
CLoop:
mov ax, [si] ;меняем местами
xchg ax, [si+2]
mov [si], ax
add si, 4 ;на следующую пару
loop CLoop
ret
change endp

end
Задача 2:
Код:
	.model	tiny
.code
.startup

mov al,56h ;анализируемое число
call formula

.exit 0

;Сначала выделяем нужные биты по маске и сравниваем на совпадение с маской (только тогда & даст 1)
;если встретим любое равенство, то по логическому "или" будем иметь 1
;возвращает в al 0 или 1
formula proc
mov ah, al
and al, 11001000b ;x7 & x6 & x3
cmp al, 11001000b
je formula_reply
mov al, ah
and al, 01010110b ;x6 & x4 & x2 & x1
cmp al, 01010110b
je formula_reply
mov al, ah
and al, 11000101b ;x7 & x6 & x2 & x0
cmp al, 11000101b
formula_reply:
;у 386 есть замечательная команда sete...
mov al, 0
jnz formula_ret
mov al, 1
formula_ret:
ret
formula endp

end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.12.2009, 17:31
общий
если честно, мне уже стыдно к вам обращаться...Но мне нужно под формат Dos...
Простите, что сразу не предупредила
давно
Посетитель
7438
7205
10.12.2009, 17:43
общий
Что Вы понимаете под форматом ДОС?
Если Вас не устраивает COM-формат (что тоже является форматом ДОС !!!),
то предполагаю, что хотите EXE-формат?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
10.12.2009, 17:57
общий
При обработке программ запускаем:
TASM <имя исходной программы> zi
TLINK <имя объектной программы> vi
Это какой формат?

вот пример программы:

Дан масив из десяти слов, содержащих целые числа. Требуется найти
максимальное значение в массиве.
Текст программы:
data segment
max dw ?
mass dw 10,24,76,479,-347,281,-24,70,124,97
data ends
code segment
assume cs: code, ds: data
start: mov ax, data
mov ds, ax ; Загрузить сегментный адрес данных
lea bx, mass ; Загрузить адрес смещения массива
mov cx, 10 ; Установить счетчик повторений цикла
mov ax, [bx] ; Первый элемент массива в Аккумулятор
beg: cmp [bx], ax ; Сравнить текущий элемент
; массива с максимальным
jl no ; он меньше
mov ax, [bx] ; он больше или равен
no: inc bx ; Следующий элемент
inc bx ; массива
loop beg
mov max, ax
quit: mov ax,4C00h ; Код завершения 0
int 21h ; Выход в DOS
code ends
end start
давно
Посетитель
7438
7205
10.12.2009, 18:17
общий
Это EXE-формат ДОС-а
Вам сделать именно в таком виде? Легко
Только подправлю чуть позже, сейчас иду домой...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
11.12.2009, 01:24
общий
Код:
data	segment
array dw 0,1,2,3,4,5,6,7,8
len equ ($-array)/2
data ends

code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
lea si, array ;адрес массива
mov cx, len ;число элементов
call change

mov ax,4c00h
int 21h

change proc
shr cx, 1 ;число пар, если нечетное число, то последнее не рассматриваем
CLoop:
mov ax, [si] ;меняем местами
xchg ax, [si+2]
mov [si], ax
add si, 4 ;на следующую пару
loop CLoop
ret
change endp

code ends
end start
Код:
code	segment
assume cs:code
start:
mov al,56h ;анализируемое число
call formula

mov ax,4c00h
int 21h

;Сначала выделяем нужные биты по маске и сравниваем на совпадение с маской (только тогда & даст 1)
;если встретим любое равенство, то по логическому "или" будем иметь 1
;возвращает в al 0 или 1
formula proc
mov ah, al
and al, 11001000b ;x7 & x6 & x3
cmp al, 11001000b
je formula_reply
mov al, ah
and al, 01010110b ;x6 & x4 & x2 & x1
cmp al, 01010110b
je formula_reply
mov al, ah
and al, 11000101b ;x7 & x6 & x2 & x0
cmp al, 11000101b
formula_reply:
;у 386 есть замечательная команда sete...
mov al, 0
jnz formula_ret
mov al, 1
formula_ret:
ret
formula endp

code ends
end start
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа