Опытный
 
Профиль
Группа: Участник
Сообщений: 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
|
|