一、子程式的呼叫與返回
1、子程式的定義
proc_name proc [near/far]......
proc_name endp
其中proc_name為子程式名,也極為call的運算元,自程式具有3個屬性:段屬性、偏移量屬性和型別屬性,段屬性表示該子程式所在段的段基值。偏移量屬性表示該子程式在段中的偏移量。型別屬性也稱為距離屬性,可以是near或far,屬性為near的子程式只能在本段內呼叫,屬性為far的子程式則可以在本段以內以及其他段中呼叫。
2、呼叫指令
二、返回指令
三、子程式設計的基本要求
1、子程式必須有一定的通用性
2、注意暫存器的儲存和恢復
3、正確使用堆疊
4、選用適當的方法在主程式與子程式間進行引數傳遞
5、編制子程式說明資訊檔案
四、子程式與主程式間的引數傳遞
1、用暫存器傳遞引數
例:將兩個給定的二進位制數(8位和16位)轉換為ascii碼字串。
分析:主程式提供唄轉換的資料和轉化後的ascii碼字串的儲存區的首位址。子程式完成二進位制的轉換。為了提高子程式的**轉換通用性,它可以完成8位或16位數的轉換。設呼叫子程式時,入口引數為:被轉換的數在dx中,若位數小於16,則從高到低存放,轉換後的ascii碼的存放首位址在di中。下面給出一種實現方法:
data segmentbin1 db 35h
bin2 dw 0ab48h
ascbuf db 20h dup (?)
data ends
stack1 segment para stack
dw 20h dup (0)
stack1 ends
code segment
assume cs:code, ds:data, ss:stack1
begin: mov ax, data
mov ds, ax
xor dx, dx
lea di, ascbuf ;存放ascii碼的單元首位址送di
mov dh, bin1 ;待轉換的第乙個資料送dh
mov ax, 8 ;待轉換的二進位制數的位數送ax
call binasc
mov dx, bin2
mov ax, 16
lea di, ascbuf
add di, 8 ;設定下乙個數的存放首位址
call binasc
mov ah, 4ch
int21h
binasc proc
mov cx, ax
lop: rol dx, 1 ;最高位移入最低位
mov al, dl
and al, 1 ;保留最低位,遮蔽其他位
add al, 30h
mov [di], al ;存結果
inc di ;修改位址指標
loop lop
ret
binasc endp
code ends
end begin
2、用堆疊傳遞引數
我們還以上面的例子來說明下問題,這次採用堆疊傳遞引數
分析:如果使用堆疊,一般用包括:
a、在主程式中,將待轉換的資料、存放ascii碼的首位址和轉換的位數壓入棧中
b、在子程式中儲存資訊
下面我們依然用程式說明問題,在程式的必要處我已經做了注釋
data segmentbin1 db 35h
bin2 dw 0ab48h
ascbuf db 20h dup (?)
data ends
stack1 segment para stack
dw 20h dup (0)
stack1 ends
code segment
assume cs:code, ds:data, ss:stack1
begin: mov ax, data
mov ds, ax
mov ah, bin1
push ax ;待轉換資料壓棧
mov ax, 8
push ax ;待轉換位數壓棧
lea di, ascbuf
push di ;存放ascii碼的首位址壓棧
call binasc ;呼叫轉換子程式
mov ax, bin2
push ax
mov ax, 10h
push ax
add di, 8
push di
call binasc
mov ah, 4ch
int21h
binasc proc
push ax
push cx
push dx
push di
mov bp, sp
mov di, [bp+10] ;從堆疊取出入口引數
mov cx, [bp+12]
mov dx, [bp+14]
lop: rol dx, 1
mov al, dl
and al, 1
add al, 30h
mov [di], al
inc di
loop lop
pop di
pop dx
pop cx
pop ax
ret 6 ;返回並從堆疊中彈出6個位元組
binasc endp
code ends
end begin
3、用位址表傳遞引數
那些年,我們一起學過的彙編 之跳轉指令
一 無條件轉移指令 1 段內轉移 a 段內轉移直接定址 段內轉移直接定址 執行的操作ip ip target與jmp指令的下一條指令的16位位移量距離。b 段內轉移間接定址 在jmp ip 通用暫存器reg的記憶體 在jmp ip 字儲存單元addr的記憶體 2 段間轉移 a 段間轉移直接定址 jm...
那些年,我們一起學過的彙編 之定址方式 二
3 基址定址 變址定址 使用bx bp定址時即成為基址定址,使用si di時,即成為變址定址。或者使用基址定址 變址定址的示例如下 mov al,10h bx 等價於mov ax,ds 10h bx mov al,20h si 等價於mov al,ds 20h si mov ah,es 30h bx...
那些年,我們一起學過的彙編 之標誌暫存器
intel 8086 8088cpu設定了乙個16位的標誌暫存器,用來反映微處理器的當前狀態和某些控制,標誌暫存器中有9個標誌位,分為兩大類 狀態標誌 cf,pf,af,zf,sf,of 和控制標誌 tf,if,df 狀態標誌由cpu根據運算結果自動設定,用來反映cpu的執行單元eu執行算術運算或邏...