Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2011, 19:13   #1
Poprigun777
Новичок
Джуниор
 
Регистрация: 13.03.2011
Сообщений: 1
По умолчанию Ассемблер. Лаба по процедурам с передачей параметров через стек

Помогите разобраться в коде. Писал не я. Основные моменты понятны. (Типа ввода вывода на экран и передачи управлен операционной системе) Если не затруднит подскажите как оно работает.

Задание:Написать программу на языке Ассемблер, состоящую из двух модулей, один из которых содержит главную процедуру, а второй - вспомогательную.
Главная процедура подготавливает исходные данные для вспомогательной процедуры и вызывает ее. Все необходимые для работы переменные описываются в модуле главной процедуры и являются внешними для вспомогательной процедуры. Вспомогательная процедура осуществляет преобразование данных, переданных ей главной процедурой. Передача параметров во вспомогательную процедуру организуется через стек. Все необходимые вспомогательной процедуре переменные должны быть организованы как локальные и размещены в стеке. Вспомогательная процедура использует стек главной процедуры и не имеет собственного сегмента данных. При часто повторяющихся действиях использовать макросы.

Действия вспомогательной процедуры – преобразование строки символов, содержащей символьное представление десятичного числа со знаком в шестнадцатеричное число в формате DWORD.
Максимальная длина строки символов – 6.
Количество передаваемых параметров – 2 (1 по адресу, 1 по значению).Результат работы программы вывести на экран.

Лабораторная работа выполняется в два этапа: сначала подготавливается вспомогательная процедура и осуществляется ее отладка. После этого вспомогательная процедура в соответствии с заданием помещается в отдельный модуль, подготавливается главная процедура, осуществляется их раздельная компиляция и редактирование связей полученных объектных модулей. Описанная последовательность действий не обязательная, а рекомендуемая.
Вспомогательная процедура должна сохранять все используемые регистры, и возвращать в регистре AX нулевое значение если преобразование прошло успешно и ненулевое если при преобразовании была обнаружена ошибка (например, значение заданного в символической форме числа не может быть размещено в требуемом количестве разрядов и т.п.).

;Вспомогательная процедура

.model small
.386
.stack 256
extrn tohex:far
.data
number db '00000000'
res db '000000$'

Message1 db 'Input: $'
Message2 db 'Result: $'
Message3 db 'Error!$'
.code


print macro param
push ax
mov ah,09h
lea dx, param
int 21h
pop ax
endm


Start:
mov ax,@data
mov ds, ax
print Message1
;output_newline


mov number[0], 7h
mov ah,0Ah
lea dx, number
int 21h


push ax
push dx

mov ah,2
mov dl,13
int 21h
mov dl,10
int 21h
print Message2


call tohex


cmp ax, 0
jz Ok


print Message3
jmp Exit
Ok:

pop edx


mov bx, 6
Preparation:

dec bx
mov al, dl

shr edx, 4
shl al, 4
shr al, 4
cmp al, 9h

jg Greater
add al, 30h
jmp Store
Greater:
add al, 37h
Store:
mov res[bx], al
cmp bx, 0
jnz Preparation


print res
Exit:
mov ax,4c00h
int 21h
end Start






;Главная процедура


.386
code segment use16
public tohex
tohex proc far

mov bp, sp
add bp, 4h
mov si, [bp]

mov cx, 0ah
FirstSym:
mov bx, 0

mov bl, [si+1]
mov di, bx

mov bx, 3h
dec di

mov eax, 0
mov edx, 0


mov al, [si+2]
cmp al, "-"
jz Start
cmp al, "+"
je Start


inc di
dec bx
jmp foo
Start:
mov eax, 0

mov al, [si+bx]
foo:
sub ax, 30h

cmp ax, cx
jge Error
cmp ah, 00h
jne Error

add eax, edx
dec di
inc bx
cmp di, 0
je StoreRes

mul ecx
mov edx, eax
jmp Start
StoreRes:

mov edx, eax
mov al, [si+2]
cmp al, "-"
jne Success

neg edx
Success:

mov [bp], edx

xor ax,ax
ret
Error:

mov ax, 1h
ret

tohex endp
code ends
end
Poprigun777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с передачей параметров Mira-girl Общие вопросы по Java, Java SE, Kotlin 2 22.11.2010 23:59
Ассемблер Лаба Сложение и вычитание чисел zefir1594 Фриланс 6 11.03.2010 19:22
создать динамический Стек через класс шаблон Petruha-nsk Общие вопросы C/C++ 1 08.11.2009 12:41
Проблема с передачей кириллицы через буфер обмена Windows Vodnik Win Api 2 12.07.2009 19:12
[TASM]Ассемблер. Стек. SoundMan Помощь студентам 4 29.11.2008 20:22