[045][汇编语言]模块化程序设计:编写子程序的标准框架

参数与结果传递

计算data段中第一组数据的3次方 结果保存在后面一组dword单元中.png
  • 子程序:计算N的3次方
cube:   mov ax,bx
                    mul bx
                    mul bx
                    ret 
  • 完成源码 : 计算data段中第一组数据的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
  • 调用者参数送入参数寄存器,从结果寄存器中取到返回值
  • 子程序参数寄存器中读到参数,将返回值送入结果寄存器

批量数据的传递

  • 批量数据放到内存,将所在内存空间的首地址放到寄存器
将一个全是字母的字符串转化为大写.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
  • 循环次数就是字符串长度

编写子程序的标准框架

用栈来保存寄存器中的内容

  • 在子程序的开始将子程序中所有用到的寄存器入栈
  • 在子程序返回前再恢复
子程序开始:      子程序使用的寄存器入栈
                子程序内容
                子程序中使用的寄存器出栈
                返回(ret、retf)

子程序

  • 说明:将一个全是字母,以0结尾的字符串,转化为大写
  • 参数: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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。