Перейти к содержанию

Помогите с Ассемблером


Рекомендуемые сообщения

L0K1

php - разучил случайно, жуткий язык.. Ни на одном языке нельзя писать такие богомерзкие конструкции..

Пытаюсь его забыть и полностью перепости на питон для веба.

Понятия не имею что в нем богомерзкого, вполне себе такой отличный язык...

Ссылка на комментарий
  • 2 месяца спустя...

Помогите решить задачу на ассемблере

В программе описать процедуру, которая вычисляет число неотрицательных элементов в массиве. Параметры передавать следующим образом:

в ВХ – смещение массива;

в СХ – число элементов в массиве;

в АХ – результат вычислений (число неотрицательных элементов).

Ссылка на комментарий

команды которые тебе будут нужны

cmp

mov

jmp

add

поработай с флагами)

возможно push и pop в зависимости от специфики задачи :)

незабудь как действует система стэк(LIFO) :)

Ссылка на комментарий
  • 4 недели спустя...

Люди, помогите пожалуйста разобраться с лабами по архитектуре ЭВМ... что и как делает эта программа? (каждая строчка) *26

assume cs:code, ds:data, ss:stacs

data segment

msg1 db 50,55 dup('$')

msg2 db 1,1 dup('$')

msg3 db 50,55 dup('$')

msg4 db 50,55 dup('$')

data ends

stacs segment

db 128 dup(?)

stacs ends

code segment

program proc Far

mov dx,data

mov ds,dx

mov ah,0ah

mov dx,offset msg1

int 21h

mov ah,02h

mov dl,13

int 21h

mov dl,10

int 21h

mov ah, 0ah

mov dx,offset msg2

int 21h

mov ah,09h

mov dx,offset msg1

inc dx

inc dx

int 21h

;name

mov ah,02h

mov dl,13

int 21h

mov dl,10

int 21h

mov ah,0ah

mov dx,offset msg3

int 21h

mov ah, 09h

mov dx, offset msg3

int 21h

mov ah, 02h

mov dl, 13

int 21h

mov dl, 10

int 21h

mov ah, 0ah

mov dx, offset msg4

int 21h

mov ah, 09h

mov dx, offset msg4

int 21h

mov ah,4ch

int 21h

program endp

code ends

end program

Ссылка на комментарий

assume cs:code, ds:data, ss:stacs ;указание где какой сегмент находится :)

data segment ;пошел сегмент данных

msg1 db 50,55 dup('$') ;первое сообщение

msg2 db 1,1 dup('$') ;второе сообщение

msg3 db 50,55 dup('$') ;третье сообщение

msg4 db 50,55 dup('$') ; четвертое сообщение

;причем прям таки вся в россыпи долларов :)

data ends ;закончился сегмент данных

stacs segment ;пошел сегмент стэка

db 128 dup(?) ;выделение под него данных

stacs ends ; закончился сегмент стэка

code segment ;пошел сегмент кода

program proc Far ; пошла процедурка

mov dx,data ;указала на данные

mov ds,dx ;указала на данные

mov ah,0ah ;указываем параметр который говорит что мы вводим какую-то гадость :)

mov dx,offset msg1 ;говорим где находится сообщение

int 21h ; собственно прерывание на ввод :)

mov ah,02h ;указываем параметр который говорит что мы выводим символ

mov dl,13 ;код возврата каретки

int 21h ; вывод этого символа :)

mov dl,10 ; код перехода на новую строку

int 21h ;вывод этого символа

mov ah, 0ah ; аналогично

mov dx,offset msg2 ;аналогично

int 21h ; аналогично

mov ah,09h ; указываем параметр который говорит что мы выводим сообщение 1

mov dx,offset msg1 ;указываем что выводим

inc dx ;

inc dx ; asm по рукой нету) не могу понять зачем)) но это сдвижка вперед

int 21h; собственно вывод месаги1

;name

mov ah,02h ;опять символ

mov dl,13 ;возврат каретки

int 21h ;вывели

mov dl,10;перенеслись на след строку

int 21h;вывели

mov ah,0ah ;хотим ввести строку

mov dx,offset msg3 ;указываем куда

int 21h ;вводим

mov ah, 09h ;хотим вывести строку

mov dx, offset msg3 ;указываем откуда

int 21h ;вывод строки

mov ah, 02h ; опять символ

mov dl, 13 ;возврат каретки

int 21h ; вывод

mov dl, 10; перенеслись на след. строку

int 21h;вывод

mov ah, 0ah;хотим ввести строку

mov dx, offset msg4 ;указываем куда

int 21h ;вводим

mov ah, 09h ; хотим вывести строку

mov dx, offset msg4 ;указываем откуда

int 21h ;вывод

mov ah,4ch ;говорим выйти хочу

int 21h ; возвращает в точку вызова :)

program endp ; the end и жили

code ends ;они :)

end program ; долго и счастливо :)

не прогонял программульку и не смотрел её работоспособность))) фиг его знает работает или нет))

но как то так вроде бы :)

Ссылка на комментарий

спасибо =) а можно я немножечко обнаглею и еще 2 лабы выложу....с такой же просьбой....=)

воть 1я

.model tiny

.stack 100h

.data

num1 db 45,12,56,72,48,56,90,24,1,19

.code

start: mov si, 0

mov al, offset num1[si]

inc si

metka1: mov bl, offset num1[si]

cmp al, bl

jns metka

mov al, bl

metka: inc si

cmp si, 9

js metka1

aam

mov dl, ah

mov dh, al

or dl, 30h

or dh, 30h

mov ah, 02h

int 21h

xchg dl, dh

int 21h

mov ah, 4ch

int 21h

end start

и 2я

assume cs:code,ds:data

data segment

a db 3 dup(?)

data ends

code segment

program proc far

mov si,0

mov dl,0

METKA: mov ah,1h

int 21h

mov offset a[si],al

mov ah,02h

mov dl,0ah

int 21h

inc si

cmp si,5

js METKA

mov si,0

xor ax,ax

mov al,offset a[si]

inc si

mov cl,offset a[si]

add al,cl

inc si

mov cl,offset a[si]

sub al,cl

inc si

mov cl,offset a[si]

mul cl

inc si

mov cl,offset a[si]

div cl

aam

mov dl,ah

mov dh,al

or dl,30h

or dh,30h

mov ah,02h

int 21h

xchg dl,dh

int 21h

mov ah,4ch

int 21h

program endp

code ends

end program

заранее огромное спасибо! =)

Ссылка на комментарий

гммм а точно первая задачка пашет?) просто вот как то я запамятовал что такое aam(посыпаю голову пеплом :) )

кстати model tiny самая маленькая программулька :)

Ссылка на комментарий

не знаю пашет или нет) я тож не помню, но гугл говорит, что команда AAM вычисляет распакованный десятичный результат с помощью деления числа в регистре AL на 10. Она помещает частное в регистр AH, оставляя остаток в регистре AL. Команда AAM устанавливает флаги нуля и знака в соответствии с результатом в регистре AL. Так как результат - распакованное десятичное число, знак всегда положителен, а знак нуля устанавливается равным 1, только если исходное число кратно 10 - т.е. если младшая значащая десятичная цифра равна 0. Остальные флаги после команды AAM остаются неопределенными. Флаг переноса теперь не имеет смысла, потому что умножение двух распакованных десятичных чисел никогда не дает результата, превосходящего число, представимое двумя десятичными цифрами. Программа также всегда может использовать команду AAM для деления двоичного числа в регистре AL на 10. В таком виде она может рассматриваться, как специальный случай команды деления, которая делит однобайтовое число в регистре AL на 10. Частное помещается в регистр AH, остаток - в регистр AL.

Ссылка на комментарий

Если честно, мозг себе сломал)) по первой задачке) скомпилировал её и получаю каждый раз разные ответы :) вроде бы в сегменте данных нашел циферки через отладчик) у меня вопрос такой))

а что вы хотите получить результатом?) и

при задании не запакованного числа каждая циферка вроде бы должна содержать 8 бит... старшие биты нулевые, а младшие и есть собственно циферка.... но у вас заданы вроде как в запакованном виде(число из 2 цифр кодируется одним байтом)....?

P.S. то что после aam значит вывод цифр на экран там где {or 30h} это тупо представление вашей цифры в ascii коде, а вот то что идет до aam для меня загадка :)

Ссылка на комментарий

)) я регистры просматривал он из 5h слепил ah=9 al=5 с этим я полностью согласен))) а что за действия он производил до этого) не пойму))

гыыыы эврика я не так компилил)))) это нахождение максимального из ряда))))

.model tiny ;моделька памяти

.stack 100h ; для стэка

.data ; пошли данные

num1 db 45,12,56,72,48,56,90,24,1,19 ; сами данные собственно

.code ;пошел код

start: mov si, 0 ;обнуляем бегунок

mov al, offset num1[si] ;считали первый элемент

inc si ;увеличили счетчик

metka1: mov bl, offset num1[si] ; считали si элемент ряда

cmp al, bl ;сравнили какой из них больше

jns metka ; al больше прыгаем на метку) смотрим состояние флажка

mov al, bl ; ух ты bl больше))

metka: inc si ; увеличиваем бегунок

cmp si, 9 ; а мы дошли до конца ряда?

js metka1 ; нефига подобного не дошли :)

aam ; хотим получить удобоваримое число а так у нас валяется 5a а станет ah=9h al=00h

mov dl, ah ; скидываем циферки для вывода)

mov dh, al ;скидываем цифирки для вывода

or dl, 30h ; надо привести к ascii коду иначе выдаст символы из начала типа сердечек всяких квадратиков :)

or dh, 30h ; аналогично

mov ah, 02h ; указываем что надо вывести символ

int 21h ;выводим его

xchg dl, dh ;поменяли символы)) ведь и второй символ надо вывести :)

int 21h ; выводим

mov ah, 4ch ;пора выходить

int 21h ; выходим

end start ; и жили они долго и счастливо :)

а во второй задачке стэк куда то делся.....

Ссылка на комментарий

к сожалению в таком виде он не компилился :) я его переработал в удобный мне формат)

proga segment

assume cs:proga,ss:proga,ds:proga,es:proga

org 100h

start: mov si, 0

mov al, offset num1[si]

inc si

metka1: mov bl, offset num1[si]

cmp al, bl

jns metka

mov al, bl

metka: inc si

cmp si, 9

js metka1

aam

mov dl, ah

mov dh, al

or dl, 30h

or dh, 30h

mov ah, 02h

int 21h

xchg dl, dh

int 21h

int 20h

num1 db 45,12,56,72,48,56,90,24,1,19

proga ends

end start

вот что то типа такого я ваял)) впринципе тоже самое) попробуй скомпилить под рукой нету asma незнаю может накосячил где-нить)

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...