• 汇编学习笔记29,30


    周五,周六没有看,周日把29,30一起看了。

    29讲内容为子程序调用的参数传递。

    子程序调用的参数传递主要有几种:利用寄存器传递参数,利用约定存储单元传递参数,利用堆栈传递参数。

    利用约定存储单元传递参数可适用于参数较多的情况下。

    例:32位数相加

    ; 子程序名: MADD

    ; 功能:       32位数相加

    ; 入口参数: DATA1和DATA2缓冲区中分别存放要相加的32位数

    ; 出口参数: DATA3缓冲区中存放结果。

    ; 说明:       (1) 32位数据采用高高低低的原则存放在缓冲区中

    ;               (2) 可能产生的进位存放在DATA3开始的第5个字节中

    MADD PROC

    PUSH AX

    PUSH CX

    PUSH SI

    MOV CX, 2

    XOR SI, SI

    MADD1: MOV AX, WORD PTR DATA1[SI]

    ADC AX, WORD PTR DATA2[SI]

    MOV WORD PTR DATA3[SI], AX

    INC SI

    INC SI

    LOOP MADD1

    MOV AL, 0

    ADC AL, 0

    MOV BYTE PTR DATA3 + 4, AL

    POP SI

    POP CX

    POP AX

    RET

    MADD ENDP

    利用堆栈传递参数,把要传递的参数依次压入堆栈中进行传递。

    例:

    ; 子程序名: STRLEN

    ; 功      能: 测量字符串的长度

    ; 入口参数: 字符串起始地址的段值和偏移在堆栈中

    ; 出口参数: AX=字符串长度

    STRLEN PROC

    PUSH BP

    MOV BP, SP

    PUSH DS

    PUSH SI

    MOV DS, [BP + 6]

    MOV SI, [BP + 4]

    MOV AL, 0

    STRLEN1: CMP AL, [SI]

    JZ STRLEN2

    INC SI

    JMP STRLEN1

    STRLEN2: MOV AX, SI

    SUB AL, [BP + 4]

    POP SI

    POP DS

    POP BP

    RET

    STRLEN ENDP

    ; 调用程序

    MOV AX, SEG STRMESS

    PUSH AX

    MOV AX, OFFSET STRMESS

    PUSH AX

    CALL STRLEN

    ADD SP 4

    MOV LEN, AX

    第30讲开始,讲DOS功能调用及应用。

    DOS功能主要有三类,设备驱动(基本I/O),文件管理及其他(内存管理,置取时间,置取中间向量,中止程序等)

    DOS功能调用分为三步:

    1) 准备入口参数

    2) 将调用号送入AH

    3) 软中断指令INT 21H

    1.基本I/O功能调用

    1) 键盘输入

    1号功能: 带回显的键盘输入, 输入字符送入DL中,检测CTRL+BREAK键,如果按下,则停止等待

    8号功能: 不带回显的键盘输入,但是会检测用户按下CTRL+BREAK时停止。

    7号功能: 不带回显的键盘输入,也不检测是否按下CTRL+BREAK

    2) 键盘输出

    2号功能: 向标准输出设备输出显示一个字符,入口参数放入DL

    9号功能: 显示输出一个字符串,输出字符串首地址在DS: DX中,输出字符串以$结束。

    3) 递归调用

    直接调用它自身,称为直接递归调用。递归子程序必须使用寄存器或堆栈传递参数

    例:用2进制形式显示所按键的ASCII码

    CSEG SEGMENT

    ASSUME CS: CSEG, DS: CSEG

    START: MOV AH, 1

    INT21H

    CALL NEWLINE          ; 回车换行

    MOV BL, AL

    MOV CX, 8

    NEXT: SHL BL, 1

    MOV DL, 30H

    ACD DL, 0

    MOV AH, 2

    INT 21H

    LOOP NEXT

    MOV DL, 'B'

    MOV AH, 2

    INT 21H

    MOV AH, 4CH

    INT 21H

    CSEG ENDS

    END START

    ; NEWLINE

    ; 回车换行

    NEWLINE PROC

    PUSH AX

    PUSH DX

    MOV DL, 0DH

    MOV AH, 2

    INT 21H

    MOV DL, 0AH

    MOV AH, 2

    INT 21H

    POP DX

    POP AX

    RET

    NEWLINE ENDP

    例2:求阶乘

    ; FACT

    ; n!

    ; (AX) = n

    ; (AX) = n!

    FACT PROC

    PUSH DX

    MOV DX, AX

    CMP AX, 0

    JZ DONE

    DEC AX

    CALL FACT

    MUL DX

    POPDX

    RET

    DONE: MOV AX, 1

    POP DX

    RET

    FACT ENDP

  • 相关阅读:
    [0] 需求管理工具CaliberRM
    [0] 自动化测试工具QTP
    [0] UML建模工具(StarUML)
    [0] C# 扩展方法(Extension Method)
    [0] 统一软件过程(RUP)
    [0] XP敏捷开发
    关于ES6的let,const与var之间的三生三世
    lumen手记:自定义Validate表单验证
    window下python安装pip,切换为国内阿里云镜像
    Lumen开发:简单实现auth用户认证
  • 原文地址:https://www.cnblogs.com/hailong/p/1918269.html
Copyright © 2020-2023  润新知