• 8086汇编语言程序设计——子程序与模块化


    标准的子程序结构

    利用跳转可以实现子程序调用。所谓调用,实际上就是程序转移到该标号去继续执行。。这种方式虽然简便,但是在模块化程序结构设计中,是不规范的。尤其是其它模块中的某个程序想要调用这个子程序时,还需要指明该子程序标号是在哪个模块、哪个代码段的哪个程序中。

    标准的用法是用8086汇编语言提供的过程定义伪指令PROC来定义子程序。

    示例 从键盘键入一个多位十进制数X,回车结束输入。按十进制位相加后显示十进制结果Y。

    设计思路:
    (1) 主程序分别调用三个子程序。
    (2) 子程序SUBR1为键盘输入多位十进制数且直接保存到X,输入的位数在BX;
    (3) 子程序SUBR2将保存的X去掉ASCII码,按位相加,相加的结果在BX中;
    (4) 子程序SUBR3将BX中的数用十进制显示;
    (5) 采用将结果除以10保存余数的方法将BX中的数转换为十进制数,并用十进制数的ASCII码显示结果。
    (6) 传参寄存器为BX。

    代码:

     1 ;a.asm  键入一个十进制数x,按位相加后显示十进制结果y。
     2 data segment
     3   infor1 db 0ah,0dh,'x=$'
     4   infor2 db 0ah,0dh,'y=$'
     5         x  db 20 dup(?)
     6 data ends
     7 code segment 
     8 assume cs:code,ds:data
     9 start:    mov ax,data
    10 mov ds,ax
    11 ;主程序
    12 main proc far        ;主程序定义,远程的
    13 mov x,0
    14 mov dx,offset infor1            ;显示提示1
    15 mov ah,9
    16 int 21h
    17 mov bx,0                        ;传参寄存器bx清0
    18 call subr1                    ;调子程序1
    19 mov cx,bx                    ;保存x的位数
    20 mov ax,0
    21 mov bx,0
    22 call subr2                    ;调子程序2
    23 mov dx,offset infor2            ;显示提示2
    24 mov ah,9
    25 int 21h    
    26 call subr3                    ;调子程序3
    27 jmp main
    28 out1:    mov ah,4ch
    29 int 21h
    30 main endp
    31 ;子程序1:键盘输入、保存
    32 subr1 proc near        ;定义子程序1,近程的
    33 mov ah,1                        ;键盘输入十进制数
    34 int 21h
    35 cmp al,0dh                    ;回车?
    36 jz exit
    37 cmp al,'0'                    ;其它非法字符?
    38 jl out1                        ;是转out1,直接退出
    39 cmp al,'9'
    40 jg out1    
    41 mov x[bx],al                    ;保存键入的数码
    42 inc bx                        ;BX=数码个数
    43 jmp subr1
    44 exit:    cmp bx,0                    ;第一键就是回车
    45 jz out1
    46 ret                            ;返回主程序
    47 subr1 endp
    48 ;子程序2,按位相加
    49 subr2 proc near        ;定义子程序2,近程的
    50 mov ah,x[bx]                    ;取出键入的数码
    51 and ah,0fh                    ;去掉ASCII码
    52 add al,ah                    ;按位相加
    53 inc bx
    54 loop subr2                    ;循环累加
    55 mov ah,0
    56 mov bx,ax                    ;相加结果→bx传参寄存器
    57 ret                            ;返回主程序
    58 subr2 endp
    59 ;子程序3,将bx中的数显示为十进制数
    60 subr3 proc near        ;定义子程序3,近程的
    61 mov ax,bx                    ;bx为传参寄存器
    62 mov cx,0
    63 mov bx,10                    
    64 let1:                                ;将ax变为十进制数
    65 mov dx,0                        ;字除法的高字清0
    66 inc cx                        ;统计余数个数
    67 div bx                        ;除以10,商在AX,余数在DX
    68 push dx                        ;保存余数
    69 cmp ax,0
    70 jnz let1
    71 let2:                                ;循环显示余数,循环次数在cx中
    72 pop ax                        ;将余数弹入ax
    73 add ax,0030h                    ;调整为ASCII码
    74 mov dl,al                    ;2号功能显示
    75 mov ah,2
    76 int 21h
    77 loop let2
    78 ret                            ;返回主程序
    79 subr3 endp
    80 code ends
    81 end start
  • 相关阅读:
    .NET自带控件 ································
    FCKeditor 2.2 + Asp.Net 设置
    . Net 2.0 实现动态切换首页图片···················
    按月统计的问题,即数据中没有该月的数据,该月的数据显示为0
    Active Directory如何用C#进行增加、删除、修改、查询用户与组织单位!
    GridView 的排序 !!
    利用GridView显示主细表并一次编辑明细表所有数据的例子 !!【转自孟子e章】
    [翻译]使用ASP.NET2.0的ReportViewer查看RDLC报表 !!!
    opengl 教程(20) 点光源
    每个程序员都应该了解的内存知识(1)
  • 原文地址:https://www.cnblogs.com/lfri/p/10785145.html
Copyright © 2020-2023  润新知