NIMITIZ 发表于 2021-5-16 20:55

8086汇编语言程序设计简要记录(三)

一个涉及子程序调用以及将结果输出到显示器的8086汇编程序。
利用子程序对数据段NUM0db 11,12,13,14和NUM1db 12,13,14,15对应的各个数进行求和(即对NUM0和NUM1进行求和,对NUM0和NUM1进行求和······),将结果存储于以1000H起始的数据段中,并输出结果。

源程序:
DATA SEGMENT
    NUM0 DB 11,12,13,14
    NUM1 DB 12,13,14,15
    ORG 1000H
    SUM DB 4 DUP(?)
DATA ENDS

CODE SEGMENT
    ASSUME DS:DATA,CS:CODE

    START:
    MOV AX,DATA
    MOV DS,AX

    MOV CX,4
    LEA SI,NUM0   ;取段NUM0的偏移地址
    LEA DI,NUM1   ;取段NUM1的偏移地址

    L:
    MOV BL,
    MOV BH,
    ADD BH,BL       ;两数相加

    PUSH SI   ;将段NUM0的偏移地址SI压栈,避免与段SUM的偏移地址SI冲突
    MOV SUM,BH      ;将两数相加的结果写入段SUM
    INC SI
    POP SI      ;将段NUM0的偏移地址SI弹栈

    CALL DISPLAY      ;调用子程序DISPLAY实现输出功能
    INC SI
    INC DI
    LOOP L

    MOV AH,4CH
    INT 21H

    DISPLAY PROC      ;子程序DISPLAY

      MOV AL,BH       ;将8位的两数相加之和转换为16位并写入AX作被除数
      MOV AH,0H
      MOV BL,10       ;8位的除数
      DIV BL      ;SUM/10,取得SUM的十位和个位
      PUSH AX   ;将商和余数压栈(商被写入AL,余数被写入AH)

      MOV DL,AL
      ADD DL,30H      ;将SUM的十位转换为其ASCII值,使十位能以字符形式输出
      MOV AH,2H       ;输出结果
      INT 21H

      POP AX      ;将商和余数弹栈
      MOV DL,AH
      ADD DL,30H      ;将SUM的个位转换为其ASCII值,使个位能以字符形式输出
      MOV AH,2H       ;输出结果
      INT 21H

      MOV DL,'D'      ;输出字符D
      MOV AH,2H
      INT 21H

      MOV DL,10       ;输出“换行”
      MOV AH,2H
      INT 21H

      RET   ;子程序返回
      DISPLAY ENDP

CODE ENDS
    END START

调试结果和运行结果如下:
页: [1]
查看完整版本: 8086汇编语言程序设计简要记录(三)