|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
复制代码
|
|