汇编学习(五)8086汇编拾遗 (4)

本文探讨了汇编语言中使用寄存器存储参数与结果的过程,详细解释了调用者与子程序之间的交互方式。通过实例展示了如何实现大小写转换和数字打印等基本功能,深入介绍了汇编语言编程的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编模块化成程序语言设计

使用寄存器来存储参数和结果是最常用使用的方法。对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反,调用者将参数送入寄存器,从结果寄存器中取到返回值;子程序从参数寄存器中取到参数,将返回值送入结果寄存器中。

上边这段话,看起来像是很冗余,但是却贯穿汇编语言始终8086,X86都是如此。

一个转换大小写的程序
assume cs:code data segment db 'helloworld' data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,10 call capt mov ax,4c00h int 21h capt: and byte ptr [si] ,11011111b inc si loop capt ret code ends end start

以上,将hello world  转换成大写。 一个使用函数显示字符串的例子实验10练习题,自己写的,不是太好。

assume cs:code

data segment

    db 'welcome to masm!',0

data ends

code segment
    
    start:
            mov ax,data
            mov ds,ax        ;set data
            mov si,0
            mov dh,8
            mov dl,3
            mov cl,2
            call show_ptr
            
            mov ax,4c00h
            int 21h

    show_ptr:
            push ax
            push bx
            push es
            push si
            push cx

            mov  ax,0b800h
            mov  es,ax          ;set es view segment

            mov ax,160          
            mul dh
            mov bl,dl
            mov bh,0
            add ax,bx
            add ax,bx
            mov di,ax

            mov ah,cl
            mov si,0
        x:
            mov cl,ds:[si]
            mov ch,0
            jcxz ok

            mov al,cl
            mov es:[di],ax
            inc si
            inc di
            inc di
            jmp x
        ok :
            pop cx
            pop si
            pop es
            pop bx
            pop ax

            ret
code ends

end start

打印数字1266

assume cs:code

data segment

    db 10 dup(0)

data ends


code segment

    start:
            mov ax,12666
            mov bx,data
            mov ds,bx
            mov si,0
            call dtoc

            mov dh,8
            mov dl,3
            mov cl,2
            call show_ptr
            
            mov ax,4c00h
            int 21h

        dtoc:
            push ax
            push bx
            push cx
            push dx
            push si

            mov bx,0
        x:
            mov dx,0
            mov cx,10
            div cx
            mov cx,ax
            add dx,'0'
            push dx
            inc bx
            jcxz z
            jmp x
        z:
            mov cx,bx
        x1:
            pop ds:[si]
            inc si
            loop x1

            pop si
            pop dx
            pop cx
            pop bx
            pop ax
            ret
        show_ptr:
            push ax
            push cx
            push dx
            push es
            push si
            push di 

            mov ax,0b800h
            mov es,ax

            dec dh
            mov al,160
            mul dh
            add dl,dl
            mov dh,0
            add ax,dx
            mov di,ax

            mov ah,cl
        x2:  
            mov cl,ds:[si]
            mov ch,0
            jcxz F
            
            mov al,cl
            mov es:[di],ax
            inc si
            inc di
            inc di
            jmp x2

        F:
            pop di
            pop si
            pop es
            pop dx
            pop cx
            pop ax
            ret
code ends

end start

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值