| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
 本帖最后由 FinalDestiny117 于 2019-5-22 02:12 编辑  
 
程序功能为:使用调用子程序的方法,对于给定的数组ARY1和ARY2,对其进行求和并将结果保存到放入存储器[BX]中 
代码如下: 
- STACK   SEGMENT   PARA STACK 'STACK'
 
 - SPAE    DW     20 DUP(?)
 
 - TOP     EQU    LENGTH SPAE   ; 等价于 TOP LABEL WORD; 栈底指针
 
 - STACK   ENDS
 
 - DATA    SEGMENT
 
 - ;ARY1    DB     100 DUP(?)    ; 定义数组1
 
 - ARY1    DB 75, 10, 217, 157, 87, 37, 92, 45
 
 -         DB 130, 4, 83, 213, 156, 5, 56, 63 
 
 -         DB 217, 62, 232, 78, 104, 28, 118, 14 
 
 -         DB 237, 217, 210, 227, 168, 9, 153, 243 
 
 -         DB 19, 114, 145, 106, 152, 237, 152, 26 
 
 -         DB 241, 235, 240, 142, 240, 40, 205, 201 
 
 -         DB 102, 181, 23, 206, 209, 142, 220, 190 
 
 -         DB 103, 174, 162, 15, 183, 59, 3, 203 
 
 -         DB 173, 148, 53, 69, 129, 205, 96, 114 
 
 -         DB 184, 80, 0, 168, 120, 205, 113, 222 
 
 -         DB 130, 137, 172, 83, 23, 136, 18, 126 
 
 -         DB 55, 180, 141, 238, 239, 144, 185, 156 
 
 -         DB 36, 239, 226, 165 
 
 - SIZE1   EQU $-ARY1
 
 - SUM1    DW     ?
 
 - ;ARY2    DB     200 DUP(?)    ; 定义数组2
 
 - ARY2    DB 75, 10, 217, 157, 87, 37, 92, 45, 130, 4, 83, 213, 156, 5, 56, 63 
 
 -               DB 36, 239, 226, 165 
 
 - SIZE2   EQU $-ARY2
 
 - SUM2    DW     ?
 
 - DATA    ENDS
 
  
- MAIN    SEGMENT              ; 主程序段
 
 -         ASSUME CS:MAIN, DS:DATA, SS:STACK
 
 - STR:    MOV    AX,DATA
 
 -         MOV    DS,AX
 
 -         MOV    AX, SIZE1          ; SIZE ARY1
 
 -         PUSH   AX            ; SUM 过程的入口参数1进栈
 
 -         MOV    AX,OFFSET ARY1
 
 -         PUSH   AX            ; SUM 过程的入口参数2进栈
 
 -         CALL   FAR PTR SUM
 
 -         MOV    AX, SIZE2      ;SIZE ARY2
 
 -         PUSH   AX
 
 -         MOV    AX,OFFSET ARY2
 
 -         PUSH   AX
 
 -         CALL   FAR PTR SUM
 
 -         MOV    AX, 4C00H
 
 -         INT    21H
 
 - MAIN    ENDS
 
  
 
- PROCE   SEGMENT             ; 过程段
 
 -         ASSUME   CS:PROCE, DS:DATA,SS:STACK
 
 - SUM     PROC   FAR          ; 因为SUM和MAIN在不同的代码段内
 
 -         PUSH   AX            ; 保护现场
 
 -         PUSH   BX
 
 -         PUSH   CX
 
 -         PUSH   BP
 
 -         MOV    BP,SP         ; 将 BP 设为栈顶
 
 -         PUSHF                ; 保存标志
 
 -         MOV    CX,[BP+14]    ; CX 设为数组元素个数
 
 -         MOV    BX,[BP+12]    ; BX 设为数组首地址(段内偏移地址)
 
 -         MOV    AX,0          ; 将 AX 清零
 
 - ADN:    ADD    AL,[BX]
 
 -         INC    BX            ; 将BX指向下一个元素
 
 -         ADC    AH,0          ; 将进位加至AH
 
 -         LOOP   ADN
 
 -         MOV    [BX],AX       ; 数据之和送到结果区
 
 -         POPF                 ; 恢复现场
 
 -         POP    BP
 
 -         POP    CX
 
 -         POP    BX
 
 -         POP    AX
 
 -         RET    4             ; 返回并废除参数 1 和 2 (共4个字节)
 
 - SUM     ENDP
 
 - PROCE   ENDS
 
 -         END STR
 
 
  复制代码 
 
在两次从子程序返回后,如何使用-d命令显示并记录 SUM1和SUM2值?
 本帖最后由 jackz007 于 2019-5-22 11:35 编辑 
        sum1 紧随 array1 之后,占 2 个字节,sum2 紧随 array2 之后,占 2 个字节。 
        所以: 
              sum1 地址 = array1 起始地址 + array1 字节长度 
              sum2 地址 = array2 起始地址 + array2 字节长度
 - 0775:0000 B86D07        MOV        AX,076D          <--- 注意数据段地址 076D                          
 
 - 0775:0003 8ED8          MOV        DS,AX                              
 
 - 0775:0005 B86400        MOV        AX,0064          <--- array1 长度                             
 
 - 0775:0008 50            PUSH        AX                                 
 
 - 0775:0009 B80000        MOV        AX,0000          <--- array1 起始地址                          
 
 - 0775:000C 50            PUSH        AX                                 
 
 - 0775:000D 9A00007807    CALL        0778:0000       <--- sum                          
 
 -                                                     <--- 调用完后,用命令 d 076d:64 l2 可以看到累加结果(64h = 0h + 64h)
 
 - 0775:0012 B81400        MOV        AX,0014          <--- array2 长度                            
 
 - 0775:0015 50            PUSH        AX                                 
 
 - 0775:0016 B86600        MOV        AX,0066          <--- array2 起始地址                            
 
 - 0775:0019 50            PUSH        AX                                 
 
 - 0775:001A 9A00007807    CALL        0778:0000       <--- sum
 
 -                                                     <--- 调用完后,用命令 d 076d:7a l2 可以看到累加结果(7ah = 66h + 14h)                          
 
 - 0775:001F B8004C        MOV        AX,4C00                            
 
 - 0775:0022 CD21          INT        21                                 
 
  复制代码 
 
 
 |   
 
 
 
 |