本人珍藏彙編子程式

2021-05-21 18:42:42 字數 3950 閱讀 9471

彙編實驗終於考完了,感覺終不負辛苦的付出,彙編子程式實際程式設計中感覺作用挺大的,收集了一下這個學期以來積累的子程式貼出來,留作紀念。

希望前輩不吝賜教。

二進位制形式輸出,顯示結果固定為十六位

;設(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個工...