[045][匯編語言]模塊化程序設計:編寫子程序的標準框架

參數(shù)與結果傳遞

計算data段中第一組數(shù)據(jù)的3次方 結果保存在后面一組dword單元中.png
  • 子程序:計算N的3次方
cube:   mov ax,bx
                    mul bx
                    mul bx
                    ret 
  • 完成源碼 : 計算data段中第一組數(shù)據(jù)的3次方 結果保存在后面一組dword單元中
assume cs:code
    data segment
        dw 1,2,3,4,5,6,7,8
        dd 0,0,0,0,0,0,0,0
    data ends
    
    code segment
        start:  mov ax,data
                mov ds,ax
                mov si,0
                mov di,16
                
                mov cx,8
            s:  mov bx,[si]
                call cube
                mov [di],ax
                mov [di].2,dx
                add si,2
                add di,4
                loop s
            
                mov ax,4c00H
                int 21H
            
            cube:   mov ax,bx
                    mul bx
                    mul bx
                    ret 
        code ends
        end start
  • 調用者參數(shù)送入參數(shù)寄存器,從結果寄存器中取到返回值
  • 子程序參數(shù)寄存器中讀到參數(shù),將返回值送入結果寄存器

批量數(shù)據(jù)的傳遞

  • 批量數(shù)據(jù)放到內存,將所在內存空間的首地址放到寄存器
將一個全是字母的字符串轉化為大寫.png
  • 子程序:將 ds:si 所指單元中的字母轉化為大寫
capital:    and byte ptr [si],11011111B
                    inc si
                    loop capital
                    ret
  • 完整源碼:將一個全是字母的字符串轉化為大寫
assume cs:code
    data segment
        db 'conversation'
    data ends
    
    code segment
        start:  mov ax,data
                mov ds,ax
                mov si,0
                mov cx,12
                call capital
                mov ax,4c00H
                int 21H
                
        capital:    and byte ptr [si],11011111B
                    inc si
                    loop capital
                    ret
            code ends
            end start
  • 循環(huán)次數(shù)就是字符串長度

編寫子程序的標準框架

用棧來保存寄存器中的內容

  • 在子程序的開始將子程序中所有用到的寄存器入棧
  • 在子程序返回前再恢復
子程序開始:      子程序使用的寄存器入棧
                子程序內容
                子程序中使用的寄存器出棧
                返回(ret、retf)

子程序

  • 說明:將一個全是字母,以0結尾的字符串,轉化為大寫
  • 參數(shù):ds:si 指向的字符串的首地址
  • 結果:沒有返回值
capital:    push cx
                        push si
            
            change:     mov cl,[si]
                        mov ch,0
                        jcxz ok
                        and byte ptr [si],11011111B
                        inc si
                        jmp short change
                
                ok:     pop si
                        pop cx
                        ret

完整源碼

將一個全是字母,以0結尾的字符串,轉化為大寫
assume cs:code
    data segment
        db 'word',0
        db 'unix',0
        db 'wind',0
        db 'good',0
    data ends
    
    code segment
        start:  mov ax,data
                mov ds,ax
                mov bx,0
                
                mov cx,4
            s:  mov si,bx
                call capital
                add bx,5
                loop s
                
                mov ax,4c00h
                int 21H
                                
            capital:    push cx
                        push si
            
            change:     mov cl,[si]
                        mov ch,0
                        jcxz ok
                        and byte ptr [si],11011111B
                        inc si
                        jmp short change
                
                ok:     pop si
                        pop cx
                        ret
                        
            code ends
            end start
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容