Автор: SERIOUS2
Дата сообщения: 13.05.2011 06:45
Мне нужно три задачи было сделать, я не уверен в правильности этих задач, помогите люди пожалуйста
Программа вызывает процедуру, которая выводит символы. Параметры передаются через регистр. Тип процедуры дальняя. Процедура, вызывается 5 раз.
[more=первый кусок кода]
.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
[/more]
Программа вызывает процедуру, которая выводит строку. Параметры передаются через стек. Тип процедуры дальняя.
[more=второй кусок кода]
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
[/more]
[more=второй кусок кода альтернатива]
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
[/more]
Программа вызывает процедуру, которая выводит числа. Параметры передаются через глобальную переменную. Тип процедуры ближняя.
[more=третий кусок кода]
.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
[/more]