子程式設計

2021-08-28 08:12:31 字數 4550 閱讀 1481

知識提要:

掌握子程式的定義語句;

過程名  proc  [near/far]

過程體ret

過程名  endp

其中過程名的命名方法與變數名相同,同一源程式中不能有相同的過程名.proc為過程定義開始的偽指令,endp為過程定義結束偽指令,且proc-endp必須配對使用。配對的proc-endp前面的過程名應相同。near/far定義了過程的屬性,前者表示所定義的過程只能被相同**段的程式呼叫,稱為段內呼叫;而後者所表示的過程只能被不同**段的程式呼叫,稱為段間遠呼叫。

2.子程式結構形式

乙個完整的子程式一般應包含下列內容:

)子程式的說明部分

在設計了程式時,要建立子程式的文件說明,使使用者能清楚此子程式的功能和呼叫方法.說明時,應含如下內容:

.子程式名:命名時要見名知意.

.子程式的功能:說明子程式完成的任務;

.子程式入口引數:說明子程式執行所需引數及存放位置;

.子程式出口引數:說明子程式執行結果的引數及存放位置;

.子程式所占用的暫存器和工作單元;

.子程式呼叫示例;

)掌握子程式的呼叫與返回

在組合語言中,子程式的呼叫用call,返回用ret指令來完成。當發生call過程呼叫時,返回位址入棧;而執行ret指令時,則由棧頂取出返回位址。

call指令執行分兩步走;第一步,保護返回位址,利用堆疊實現,即將返回的位址壓入堆疊;第二步,轉向子程式,即把子程式的首位址送入ip或cs:ip。

.段內呼叫與返回:呼叫子程式指令與子程式同在乙個段內。因此只修改ip;

.段間呼叫與返回:呼叫子程式與子程式分別在不同的段,因此在返回時,需同時修改cs:ip。

3.)子程式的現場保護與恢復

保護現場:在子程式設計時,cpu內部暫存器內容的保護和恢復,在執行主程式時已經占用了一定數量的暫存器,子程式執行時也要使用暫存器。子程式執行完返回主程式後,要保證主程式按原來狀態執行,這就需要對那些在主程式和子程式中都要使用的暫存器的內容在子程式體執行之前加以保護,這就是保護現場。

恢復現場:子程式執行完後再恢復這些主程式中暫存器的內容,稱為恢復現場。

一般利用堆疊實現現場保護和恢復的格式:

過程名proc [near/far]

push  ax

保護現場

push  bx..

push  dx

.過程定義體

.pop  dx

.恢復現場

.pop ax

ret過程名  endp

4.子程式的引數傳遞方法

暫存器傳遞引數

這種方式是最基本的引數傳遞方式。即 主程式呼叫子程式前,將入口引數送到約定的暫存器中。子程式可以直接從這些暫存器中取出引數進行加工處理,並將結果也放在約定的暫存器中,然後返回主程式,主程式再從暫存器中取出結果。

儲存器單元傳(變數)遞引數

這種方法是在主程式呼叫子程式前,將入口引數存放到約定的儲存單元中;子程式執行時到約定儲存位置讀取引數;子程式執行結束後將結果也放在約定儲存單元中。

用堆疊傳遞引數

利用共享堆疊區,來傳遞引數是重要的的方法之一。主程式將子程式的入口引數壓入堆疊,子程式從堆疊中依次取出這些引數;經過子程式處理後,子程式將出口引數壓入堆疊,返回主程式後再通過出棧獲取它們。

1.熟悉組合語言程式設計結構;

2.熟悉組合語言子程式設計方法;

3.熟悉利用組合語言子程式引數傳遞方法;

1.硬體環境:微機cpu 486以上,500mb以上硬碟,32m以上記憶體;

2.軟體環境:裝有masm 5.0、debug、link和edit等應用程式。

在實際應用中,經常根據遇到使用組合語言子程式來實現,其中還發涉及到引數傳遞方法。可以應用暫存器、堆疊、變數來進行,呼叫子程式的入口引數和呼叫子程式後的出口引數。

如:編寫一程式,將3個8位有符號數中的最大值存入max單元中。

分析:編制乙個求兩個數中最大值的過程,然後對其進行呼叫;由於程式中的數是符號數,所以,比較後的轉移指令應該採用jl或jg。

分析下面各程式**sy08_1.asm,掌握彙編子程式的設計與呼叫。

data segment

a db 0f1h

b db 12h

c db 7fh

max db ?

data ends

stack segment para 'stack'

stapn dw 20 dup(?)

top  equ length stapn   ;length的用法:length 變數名 。作用是返回利用dup定義的陣列中的元素個數,即重複操作符dup前的count值。

stack ends

code segment

assume cs:code ,ds:data,ss:stack

main proc far

start: push ds

mov ax,0

push ax

mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

mov sp,top

mov ah,a

mov al,b

call maxf

mov al,c

call maxf

mov max,ah

retmain endp

;子程式名為maxf。功能:求兩個數中 較大者

;入口引數:ah,al=2個有符號數

;出口引數:較大者在ah中,較小者在al中

maxf proc near

cmp ah,al

jg next

xchg ah,al

next:ret

maxf endp

code ends

end start

1、除錯下面的程式 sy08_2.asm,並給各語句增加注釋

data segment

dt1 dw 1234h,5678h,90abh,0bcdeh

cnt equ ($-dt1) /2

data ends

stack1 segment para stack

stk dw 20 dup(?)

stkcnt equ length stk

stack1 ends

code segment

assume cs:code,ds:data,ss:stack1

start:

mov ax,data

mov ds,ax

mov ax,stack1

mov ss,ax

mov sp,stkcnt

mov cx,cnt

lea si,dt1

lop:

push [si]

add si,2

loop lop

pop ax

pop bx

pop cx

pop dx

mov ah,4ch

int 21h            

code ends

end start

2、請程式設計程式實現求資料array中的最大值,以求最大值元素所在的位置,要求:最大值放在變數m中,最大值元素所在的位置放在變數index中。請補充完整下面的程式sy08_3.asm。

data segment

array dw 1234h,5678h,90abh,0bcdeh,0abcdh,6754h,3267h,8293h,5249h,0cbfeh,0cabeh

cnt equ ($-array) /2

m   dw ?       ;用於儲存資料中的最大值

index  dw ?    ;儲存資料中最大值所在的位置

data ends

stack segment para stack

stk dw 20 dup(?)

stkcnt equ length stk

stack ends

code segment

assume cs:code,ds:data,ss:stack

;***************************************

;主程式

main proc far

start:

mov ax,data

mov ds,ax

mov ax,stack

mov ss,ax

;請補充語句

call maxf

mov ah,4ch

int 21h

main endp

; *************************************

;子程式

maxf proc near

;請補充語句

retmaxf endp

;****************************************

3、作業提交

把完成後的sy08_1.asm、sy08_2.asm、sy08_3.asm提交。

子程式設計

子程式設計時 push bp mov bp,sp sub sp,2 再push其他需要儲存的暫存器,這樣可以不受儲存要暫存器個數的影響,用 bp 4 定位到第乙個引數 且釋放區域性變數空間時使用 mov sp,bp 即可。巨集呼叫中的引數如果有小於 符號,需要轉義,寫為 定式 if while do...

二十 子程式設計(函式)

把具有一定功能的程式段封裝成子程式,以供它人呼叫。引數 告訴子程式將要處理哪些數值。結果 子程式運算後的結果值。加法運算 assume cs code,ds data,ss stack data segment data ends stack segment dw 256 dup 0h stack ...

彙編 實驗8 子程式設計

1 程式設計求下列和值 s 1 2 3 1 2 3 4 1 2 3 4 5 將和值存放在資料段偏移位址為 1000h起始的單元中。data segment org 1000h x db 100 dup data ends code segment assume cs code,ds data sta...