• 汇编之宏(macro)和子程序(proc)


    1.将 bl 和 cl 中的数字相加并输出结果

    DATA SEGMENT 
        STR1 DB 0AH,0DH ,'THE RESULT IS : $' ;0AH,0DH 为换行
    DATA ENDS 
    
    CODE SEGMENT 
        ASSUME CS:CODE,DS:DATA 
    START:
    PRINT MACRO STR  ; MACRO 为宏
        MOV AX,DATA 
        MOV DS,AX
        MOV DX,OFFSET STR 
        MOV AH,09H ; 打印STR
        INT 21H 
    ENDM
    
    ADDBLCL MACRO R1,R2 ;
        MOV AL,R1 
        ADD AL,R2
        DAA  ; 压缩型BCD码加法调整指令 ,默认调整 al
    
        PUSH AX 
        MOV CL,4
        SHR AL,CL ; 逻辑右移指令
        CALL PRINT_DL ;子程序调用
    
        POP AX  
        AND AL,0FH
        CALL PRINT_DL 
    ENDM 
    
        PRINT STR1
        ADDBLCL 25H,48H
        PRINT STR1
        ADDBLCL 15H,15H 
    
        MOV BL,78H
        MOV CL,20H
        PRINT STR1
        CALL TT ;子程序调用
    
        MOV BL,11H
        MOV CL,22H
        PRINT STR1
        CALL TT
    
        MOV AX ,4C00H
        INT 21H ;return dos 
    
    PRINT_DL  PROC ;子程序的实现与声明
        ADD AL,30H
        MOV DL,AL 
        MOV AH,02H
        INT 21H
        RET 
    PRINT_DL ENDP 
    
    TT PROC 
        MOV AL,CL 
        ADD AL,BL
        DAA  
        PUSH AX 
        MOV CL,4
        SHR AL,CL ;
        CALL PRINT_DL ;
        POP AX  
        AND AL,0FH
        CALL PRINT_DL 
        RET 
    TT ENDP
    
        CODE ENDS 
    END START

    小结:

    1. shl和shr指令的使用

    shl:逻辑左移指令
    shr:逻辑右移指令
    

    <1>功能:

    (1)将一个寄存器或内存单元中的数据向X移位;
    (2)依次将移出的每一位写入CF中
    (3)不够的用0补充

    <2>注意事项:

    如果移动位数大于1时,必须将移动位数放在cl中
    

    2. DAA :压缩型BCD码加法调整指令(属于十进制调整指令)

    压缩型BCD码:   (18)=0001 1000
    非压缩型BCD码: (18)=0000 0001
                       0000 1000    
    

    <1>注意事项:

    默认调整 AL 
    

    3. 子程序写法1:放在返回dos之后

        MOV AX ,4C00H
        INT 21H ;return dos 
    
    PRINT_DL  PROC ;子程序的实现与声明
        ADD AL,30H
        MOV DL,AL 
        MOV AH,02H
        INT 21H
        RET 
    PRINT_DL ENDP 

    4. 子程序写法2 :

    CODE SEGMENT 
        ASSUME CS:CODE,DS:DATA
    START:
    MAIN PROC
        MOV AX,DATA
        MOV DS,AX 
        ......
        CALL PRINT
    
        MOV AX,4C00H
        INT 21H
    MAIN ENDP 
    PRINT PROC
        ...
    PRINT ENDP
        CODE ENDS
    END START 

    这里写图片描述

    2. 机器询问姓名,人手动输入,之后机器在屏幕显示 。

    DATA SEGMENT 
        MSG1 DB 0AH,0DH,"WHAT'S YOUR NAME : $"
        MSG2 DB 100,?,100 DUP('$') 
        ;第一个参数代表总空间大小,第一个参数代表实际输入,100 dup('$')
        ; 初始化100 个 '$' 单元
        MSG3 DB 0AH,0DH,"YOU NAME IS : $" 
    DATA ENDS 
    CODE SEGMENT 
        ASSUME CS:CODE,DS:DATA
    START:
    MAIN PROC
        MOV AX,DATA
        MOV DS,AX 
    
        MOV DX,OFFSET MSG1 
        CALL PRINT
    
        MOV DX,OFFSET MSG2 
        MOV AH,10 ;(0AH)从第三个单元开始存放
        INT 21H
    
        MOV DX,OFFSET MSG3
        CALL PRINT
    
        MOV DX,OFFSET MSG2 
        ADD DX,2
        CALL PRINT
    
        MOV AX,4C00H
        INT 21H
    MAIN ENDP 
    PRINT PROC
        MOV AH,09H
        INT 21H
        RET 
    PRINT ENDP
        CODE ENDS
    END START 

    1. 10 号 dos 功能调用

    MOV DX,OFFSET MSG2 
    MOV AH,10 ;(0AH)从MSG2第三个单元开始存放
    INT 21H
    
    调用号 功能 入口参数 出口参数
    0AH 输入字符串 DS:DX=缓冲区首址
    09H 显示字符串 DS:DX=缓冲区首址

    2.

    MSG2 DB 100,?,100 DUP('$') 
    

    第一个参数代表总空间大小,第一个参数代表实际输入的字符个数,100 dup(‘);100’ 单元
    这里写图片描述

  • 相关阅读:
    Android P Beta发布!最新版本抢先体验!
    手游热更新方案--Unity3D下的CsToLua技术
    2018 Unite大会——《使用UPA工具优化项目》演讲实录
    浅谈软件工程师的代码素养
    Android平台的Swift—Kotlin
    1计算机的基本组成-3
    1计算机的基本组成-2
    新的公司
    4 对象的行为 方法操作实例变量
    反射机制
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335290.html
Copyright © 2020-2023  润新知