Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Assembler] Процедуры 
:(
    Опции темы
Serious2008
Дата 13.5.2011, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Мне нужно три задачи было сделать, я не уверен в правильности этих задач, помогите люди пожалуйста

Программа вызывает процедуру, которая выводит символы. Параметры передаются через регистр. Тип процедуры дальняя. Процедура, вызывается 5 раз.

Код


.model small
.data
msg1 db "First", 10, 13, '$'


.stack 100h

.code
begin:
mov ax,@data
mov ds,ax

mov dx,offset msg1    ; передаваемый процедуре параметр
call show        ; вызов процедуры


mov ah,4ch
int 21h        ; выход из программы

show proc far
; в регистре dx процедуре передается эффективный адрес строки 
; для вывода
mov ah, 9
int 21h        ; вывод 
ret
show endp
end begin




Программа вызывает процедуру, которая выводит строку. Параметры передаются через стек. Тип процедуры дальняя.


Код

data segment
op1 dw ?
msg1 db 'abc$'
data ends
stack1 segment stack
db 100h dup(?)
stack1 ends
code segment
assume cs:code,ds:data,ss:stack1
begin:
mov ax,data
mov ds,ax
mov op1,offset Proc1    ; в op1 – адрес процедуры Proc1
mov ax,offset op1    ; в ax – эффективный переменной op1
push ax            ; занесение в стек адреса переменной op1
call near ptr exec_proc    ; вызов exec_proc, на экран выводится 
                ; строка ‘abc’ – выполняется Proc1, также 
                ; значение op1 изменяется
push ax            ; занесение в стек адреса переменной op1 (ведь 
            ; изменение значения не модифицирует адрес)
call near ptr exec_proc    ; вызов exec_proc, на экран выводится 
                ; строка ‘xyz’ – выполняется Proc2
mov ah,4ch
int 21h
exec_proc proc near
push bp    ; все регистры, значения которых изменяются в 
        ; процедуре, лучше всего всегда сохранять – так 
        ; процедура никогда не изменит нормальных ход 
        ; программы, из которой она вызывается
push bx
mov bp,sp
mov bx,[bp+6]    ; переданный параметр лежит по адресу bp+6, 
            ; так как два байта занимает адрес возврата из 
            ; процедуры, и 4 байта занимают сохраненные в 
            ; стеке значения bx и bp
call word ptr [bx]    ; вызов процедуры, адрес которой находится в 
            ; ячейке, адресуемой bx
Proc1 proc near
push dx
push ax
mov dx,offset msg1
mov ah,09h
int 21h    ; вывод строки ‘abc’
pop ax
pop dx
retn
Proc1 endp
code ends
end begin





Код


data segment
op1 dw ?
msg1 db 'abc$'
msg2 db 'xyz$'
data ends
stack1 segment stack
db 100h dup(?)
stack1 ends

code segment
assume cs:code,ds:data,ss:stack1
begin:
mov ax,data
mov ds,ax

mov op1,offset Proc1    ; в op1 – адрес процедуры Proc1
mov ax,offset op1    ; в ax – эффективный переменной op1
push ax            ; занесение в стек адреса переменной op1
call near ptr exec_proc    ; вызов exec_proc, на экран выводится 
                ; строка ‘abc’ – выполняется Proc1, также 
                ; значение op1 изменяется
push ax            ; занесение в стек адреса переменной op1 (ведь 
            ; изменение значения не модифицирует адрес)
call near ptr exec_proc    ; вызов exec_proc, на экран выводится 
                ; строка ‘xyz’ – выполняется Proc2

mov ah,4ch
int 21h

exec_proc proc near
push bp    ; все регистры, значения которых изменяются в 
        ; процедуре, лучше всего всегда сохранять – так 
        ; процедура никогда не изменит нормальных ход 
        ; программы, из которой она вызывается
push bx
mov bp,sp
mov bx,[bp+6]    ; переданный параметр лежит по адресу bp+6, 
            ; так как два байта занимает адрес возврата из 
            ; процедуры, и 4 байта занимают сохраненные в 
            ; стеке значения bx и bp
call word ptr [bx]    ; вызов процедуры, адрес которой находится в 
            ; ячейке, адресуемой bx
mov word ptr [bx],offset Proc2        ; изменение значения по 
                        ; адресу, который был передан 
                        ; процедуре exec_proc
pop bx        ; извлечение регистров, значения которых 
        ; модифицировались в процедуре
pop bp
retn 2    ; выход из процедуры и удаление одного элемента стека – 
    ; переданного параметра
exec_proc endp

Proc1 proc near
push dx
push ax
mov dx,offset msg1
mov ah,09h
int 21h    ; вывод строки ‘abc’
pop ax
pop dx
retn
Proc1 endp

Proc2 proc near
push dx
push ax
mov dx,offset msg2
mov ah,09h
int 21h    ; вывод строки ‘xyz’
pop ax
pop dx
retn
Proc2 endp

code ends
end begin



Программа вызывает процедуру, которая выводит числа. Параметры передаются через глобальную переменную. Тип процедуры ближняя.


Код


.model small
.data
switcher dw ?        ; общая переменная, которая будет содержать 
; эффективный адрес строки
msg1 db "First", 10, 13, '$'

.stack 100h

.code
begin:
mov ax,@data
mov ds,ax

mov switcher,offset msg1    ; глобальная переменная
call show            ; вызов процедуры


mov ah,4ch
int 21h

show proc near
mov ah, 9
mov dx,switcher    ; смещение строки
int 21h            ; вывод строки
ret
show endp
    end begin



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0443 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.