彙編實驗終於考完了,感覺終不負辛苦的付出,彙編子程式實際程式設計中感覺作用挺大的,收集了一下這個學期以來積累的子程式貼出來,留作紀念。
希望前輩不吝賜教。
二進位制形式輸出,顯示結果固定為十六位
;設(bx)=7fffh,則輸出格式為0111111111111111b,後面的大字字母b表示二進位制形式,顯示結果固定為十六位。
;入口引數bx,出口引數bx
dispbxb proc near
mov cx,16
next1: rol bx,1
jc next
mov dl,30h
jmp outp
next:mov dl,31h
outp:mov ah,2
int 21h
loop next1
mov dl,'b' ;顯示字母「b」
mov ah,2
int 21h
retdispbxb endp
; 按十進位制形式輸出乙個字(不固定位輸出,如255只輸出255,不會輸出0025)
;按十進位制形式
輸出乙個字
;入口引數bx,出口引數bx
;通過2號中斷輸出
dispbxd proc near
mov si,10
xor cx,cx
mov ax,bx
next:mov dx,0
div si
push dx
inc cx
cmp ax,0 ;商為0則完成轉換
jnz next
next2:pop dx
add dl,30h
mov ah,2
int 21h
loop next2
retdispbxd endp
;按十六進製制形式
輸出乙個字,固定四位輸出
;入口引數bx,出口引數bx
dispbxh proc near
mov cl,4
mov ch,4
next: rol bx,cl ;高低半個位元組交換
mov al,bl
and al,0fh ;讓al只保留借低位的值(bx的高位)
add al,30h
cmp al,3ah
jl next2
add al,07h ;是a~f,要多加7
next2:mov dl,al
mov ah,02h
int 21h
dec ch
cmp ch,0
ja next
mov dl,'h' ;顯示字母「h」
mov ah,2
int 21h
retdispbxh endp
decibin proc near
;通過鍵盤輸入乙個數字字串,可以多位,回車結束輸入
;出口引數 bx表示輸出的真值
mov bx,0
newchar:
mov ah,1
int 21h
sub al,30h
jl exit
cmp al,9d
jg exit
cbwxchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp newchar
exit:
retdecibin endp
;模板data segment ; 定義資料段
data ends
code segment ; 定義**段
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
mov ax, 4c00h
int 21h
code ends
end start
;在資料段定義如下字串傳遞引數
n dw ? ;存放元素個數
dataarray dw 80 dup(?),'$'
;冒泡法排序
f proc near
mov cx,n
dec cx ;cx=n-1, 為外層迴圈,並作為當前比較的最大下標
ag1: xor bx,bx ;bx作為內層迴圈的計數
lea si,dataarray
ag3: mov ax,[si]
cmp ax,[si+2]
jbe ag2
xchg ax,[si+2] ;[si]>[si+2]則交換
mov [si],ax
ag2: inc bx ;每比較一次bx增1
cmp bx,cx ;比較bx是否等於cx
je ag4
add si,2d ;bx比cx小則繼續比較, si後移兩個位元組
jmp ag3 ;跳轉到ag3, 比較下兩個元素
ag4: loop ag1 ;跳轉到ag1, 進行cx=cx-1層的迴圈
mov cx,n ;共輸出n個元素
mov bx,10d
lea si,dataarray
;輸出結果
ag5: mov ax,[si]
add si,2d ;將si指向下乙個元素
xor di,di ;di為堆疊元素的計數,即乙個數值十進位制的位數
ag6: xor dx,dx
div bx
add dx,'0' ;得到餘數對應的ascii碼
push dx ;壓棧
inc di
cmp ax,0
jnz ag6 ;當商不為0時,繼續求餘數
mov ah,02h
ag7: pop dx ;出棧
int 21h
dec di ;di計數
cmp di,0
jnz ag7 ;輸出字元數小於di時迴圈繼續
mov dl,' '
int 21h ;每個元素相隔乙個空格
loop ag5 ;輸出下乙個元素
retf endp
;判斷是否為閏年子程式,是閏年則ax=1,否則ax=0
;ax 傳入十進位制年份
leap proc
mov dx,0
mov bx,4
mov cx,ax
div bx
cmp dx,0
jnz end0
mov dx,0
mov ax,cx
mov bx,100
div bx
cmp dx,0
jnz end1
mov ax,cx
mov dx,0
mov bx,400
cmp dx,0
jz end1
end0: mov ax,0
jmp next
end1:mov ax,1
next:
retleap endp
組合語言 子程式
舉例 子程式呼叫指令call 格式為 call 子程式名 call相當於jmp 子程式名 相當於 標號 子程式執行完返回到call下一句的語句執行 在子程式中用ret 返回 子程式名proc屬性 far,near 子程式名 endp 如果主程式是被執行的第乙個程式,屬性應為far 主程式 let0 ...
組合語言 子程式呼叫
不是很常用的 子程式返回指令 說明 根據段內和段間 有無引數,具體分成4種情況 1 ret 無引數返回 2 ret n 有引數返回 n引數的作用 需要彈出call指令壓入堆疊的返回位址 3 段內返回 偏移位址ip出棧 ip ss sp sp sp 2 4 段間返回 偏移位址ip和段位址cs出棧 ip...
彙編 題目 22,23 子程式呼叫
在多模組設計中,主模組中呼叫內部模組buf1,buf2,buf3,buf4。主模組根據鍵盤輸入的指令 如 a,b,c,d 呼叫上述對應的子程式,每個子程式的任務是顯示其入口位址。呼叫後繼續等待呼叫,若輸入esc鍵 ascii碼為1bh 則結束程式的執行。請編寫完成該任務的程式。現有一控制程式共5個工...