組合語言:編寫子程式(上)
阿新 • • 發佈:2018-12-18
編寫三個子程式,通過他們來認識幾個常見的問題和掌握解決這些問題的方法
1、顯示字串
; 顯示字串子程式show_str ; 引數1 ds:si指向要顯示的字串首地址,字串以0結尾 ; 引數2 行號dh(0~24) ; 引數3 列號dl(0~79) ; 引數4 顏色屬性 cl show_str: push ax push bx push cx push dx push si push es show_str_start: mov ax,0b800h mov es,ax ; 計算行偏移 ,結果在ax中 mov al,160 mul dh ; 計算列偏移 ,結果在dx中 mov dh,0 add dx,dx ;計算總偏移,結果放在bx中 mov bx,ax add bx,dx ;到目前,es:[bx]指向目標視訊記憶體 mov dl,cl string_copy: mov cl,[si] mov ch,0 jcxz string_copy_ok ;當(ds:[si])==0時跳出迴圈 mov es:[bx],cl mov es:[bx+1],dl inc si add bx,2 jmp short string_copy string_copy_ok: pop es pop si pop dx pop cx pop bx pop ax ret
2、解決除法溢位的問題
; 解決除法溢位的子程式divdw ; 引數1 被除數 dx+ax 32位組合 ; 引數2 除數 cx ; 返回值 商:dx+ax 餘數: cx divdw: push bx push ax ; 被除數高位除CX 27/2 --> AX 商 DX 餘數 mov ax,dx mov dx,0 div cx mov bx,ax ;商的高16位暫時存放在BX中 ; 商在AX中,餘數在DX中 ; 餘數就是最終的餘數放到CX中去,商就是最終的商的低16位,不用動! pop ax div cx mov cx,dx mov dx,bx pop bx ret
3、數值顯示
; dtoc ; 引數1 ds:si 指向最終字串首地址 ; 引數2 待轉換的word型資料 ax dtoc: push ax push bx push cx push dx push si push di dtoc_start: mov di,0 ; 用di 存放壓入的資料個數 pick: mov dx,0 mov bx,10 div bx ; 商在ax中 餘數在dx中,直接進棧 add dx,30h push dx inc di mov cx,ax jcxz pick_ok jmp short pick pick_ok: mov cx,di ; 確定彈出的資料個數 ; 堆疊中的資料出棧,送到目標記憶體位置 dtoc_move: pop ax mov ds:[si],al inc si loop dtoc_move ; 在字串末尾新增一個結束符0 mov byte ptr [si],0 pop di pop si pop dx pop cx pop bx pop ax ret