Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Assembler] Процедуры


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

Программа вызывает процедуру, которая выводит символы. Параметры передаются через регистр. Тип процедуры дальняя. Процедура, вызывается 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



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)