那些年,我們一起學過的彙編 之子程式設計

2021-09-21 23:42:49 字數 3172 閱讀 1848

一、子程式的呼叫與返回

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    segment 

bin1    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    segment 

bin1    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執行算術運算或邏...