|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.03.2011, 19:13 | #1 |
Новичок
Джуниор
Регистрация: 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 |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
проблема с передачей параметров | 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 |