鱼C论坛

 找回密码
 立即注册
查看: 4864|回复: 2

[已解决]在debug中如何使用-d指令查看变量的内容

[复制链接]
发表于 2019-5-22 02:10:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 FinalDestiny117 于 2019-5-22 02:12 编辑

程序功能为:使用调用子程序的方法,对于给定的数组ARY1和ARY2,对其进行求和并将结果保存到放入存储器[BX]中
代码如下:
  1. STACK   SEGMENT   PARA STACK 'STACK'
  2. SPAE    DW     20 DUP(?)
  3. TOP     EQU    LENGTH SPAE   ; 等价于 TOP LABEL WORD; 栈底指针
  4. STACK   ENDS
  5. DATA    SEGMENT
  6. ;ARY1    DB     100 DUP(?)    ; 定义数组1
  7. ARY1    DB 75, 10, 217, 157, 87, 37, 92, 45
  8.         DB 130, 4, 83, 213, 156, 5, 56, 63
  9.         DB 217, 62, 232, 78, 104, 28, 118, 14
  10.         DB 237, 217, 210, 227, 168, 9, 153, 243
  11.         DB 19, 114, 145, 106, 152, 237, 152, 26
  12.         DB 241, 235, 240, 142, 240, 40, 205, 201
  13.         DB 102, 181, 23, 206, 209, 142, 220, 190
  14.         DB 103, 174, 162, 15, 183, 59, 3, 203
  15.         DB 173, 148, 53, 69, 129, 205, 96, 114
  16.         DB 184, 80, 0, 168, 120, 205, 113, 222
  17.         DB 130, 137, 172, 83, 23, 136, 18, 126
  18.         DB 55, 180, 141, 238, 239, 144, 185, 156
  19.         DB 36, 239, 226, 165
  20. SIZE1   EQU $-ARY1
  21. SUM1    DW     ?
  22. ;ARY2    DB     200 DUP(?)    ; 定义数组2
  23. ARY2    DB 75, 10, 217, 157, 87, 37, 92, 45, 130, 4, 83, 213, 156, 5, 56, 63
  24.              DB 36, 239, 226, 165
  25. SIZE2   EQU $-ARY2
  26. SUM2    DW     ?
  27. DATA    ENDS

  28. MAIN    SEGMENT              ; 主程序段
  29.         ASSUME CS:MAIN, DS:DATA, SS:STACK
  30. STR:    MOV    AX,DATA
  31.         MOV    DS,AX
  32.         MOV    AX, SIZE1          ; SIZE ARY1
  33.         PUSH   AX            ; SUM 过程的入口参数1进栈
  34.         MOV    AX,OFFSET ARY1
  35.         PUSH   AX            ; SUM 过程的入口参数2进栈
  36.         CALL   FAR PTR SUM
  37.         MOV    AX, SIZE2      ;SIZE ARY2
  38.         PUSH   AX
  39.         MOV    AX,OFFSET ARY2
  40.         PUSH   AX
  41.         CALL   FAR PTR SUM
  42.         MOV    AX, 4C00H
  43.         INT    21H
  44. MAIN    ENDS


  45. PROCE   SEGMENT             ; 过程段
  46.         ASSUME   CS:PROCE, DS:DATA,SS:STACK
  47. SUM     PROC   FAR          ; 因为SUM和MAIN在不同的代码段内
  48.         PUSH   AX            ; 保护现场
  49.         PUSH   BX
  50.         PUSH   CX
  51.         PUSH   BP
  52.         MOV    BP,SP         ; 将 BP 设为栈顶
  53.         PUSHF                ; 保存标志
  54.         MOV    CX,[BP+14]    ; CX 设为数组元素个数
  55.         MOV    BX,[BP+12]    ; BX 设为数组首地址(段内偏移地址)
  56.         MOV    AX,0          ; 将 AX 清零
  57. ADN:    ADD    AL,[BX]
  58.         INC    BX            ; 将BX指向下一个元素
  59.         ADC    AH,0          ; 将进位加至AH
  60.         LOOP   ADN
  61.         MOV    [BX],AX       ; 数据之和送到结果区
  62.         POPF                 ; 恢复现场
  63.         POP    BP
  64.         POP    CX
  65.         POP    BX
  66.         POP    AX
  67.         RET    4             ; 返回并废除参数 1 和 2 (共4个字节)
  68. SUM     ENDP
  69. PROCE   ENDS
  70.         END STR
复制代码


在两次从子程序返回后,如何使用-d命令显示并记录 SUM1和SUM2值?
最佳答案
2019-5-22 11:19:09
本帖最后由 jackz007 于 2019-5-22 11:35 编辑

        sum1 紧随 array1 之后,占 2 个字节,sum2 紧随 array2 之后,占 2 个字节。
        所以:
              sum1 地址 = array1 起始地址 + array1 字节长度
              sum2 地址 = array2 起始地址 + array2 字节长度
  1. 0775:0000 B86D07        MOV        AX,076D          <--- 注意数据段地址 076D                          
  2. 0775:0003 8ED8          MOV        DS,AX                              
  3. 0775:0005 B86400        MOV        AX,0064          <--- array1 长度                             
  4. 0775:0008 50            PUSH        AX                                 
  5. 0775:0009 B80000        MOV        AX,0000          <--- array1 起始地址                          
  6. 0775:000C 50            PUSH        AX                                 
  7. 0775:000D 9A00007807    CALL        0778:0000       <--- sum                          
  8.                                                     <--- 调用完后,用命令 d 076d:64 l2 可以看到累加结果(64h = 0h + 64h)
  9. 0775:0012 B81400        MOV        AX,0014          <--- array2 长度                           
  10. 0775:0015 50            PUSH        AX                                 
  11. 0775:0016 B86600        MOV        AX,0066          <--- array2 起始地址                           
  12. 0775:0019 50            PUSH        AX                                 
  13. 0775:001A 9A00007807    CALL        0778:0000       <--- sum
  14.                                                     <--- 调用完后,用命令 d 076d:7a l2 可以看到累加结果(7ah = 66h + 14h)                          
  15. 0775:001F B8004C        MOV        AX,4C00                           
  16. 0775:0022 CD21          INT        21                                 
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-22 11:19:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2019-5-22 11:35 编辑

        sum1 紧随 array1 之后,占 2 个字节,sum2 紧随 array2 之后,占 2 个字节。
        所以:
              sum1 地址 = array1 起始地址 + array1 字节长度
              sum2 地址 = array2 起始地址 + array2 字节长度
  1. 0775:0000 B86D07        MOV        AX,076D          <--- 注意数据段地址 076D                          
  2. 0775:0003 8ED8          MOV        DS,AX                              
  3. 0775:0005 B86400        MOV        AX,0064          <--- array1 长度                             
  4. 0775:0008 50            PUSH        AX                                 
  5. 0775:0009 B80000        MOV        AX,0000          <--- array1 起始地址                          
  6. 0775:000C 50            PUSH        AX                                 
  7. 0775:000D 9A00007807    CALL        0778:0000       <--- sum                          
  8.                                                     <--- 调用完后,用命令 d 076d:64 l2 可以看到累加结果(64h = 0h + 64h)
  9. 0775:0012 B81400        MOV        AX,0014          <--- array2 长度                           
  10. 0775:0015 50            PUSH        AX                                 
  11. 0775:0016 B86600        MOV        AX,0066          <--- array2 起始地址                           
  12. 0775:0019 50            PUSH        AX                                 
  13. 0775:001A 9A00007807    CALL        0778:0000       <--- sum
  14.                                                     <--- 调用完后,用命令 d 076d:7a l2 可以看到累加结果(7ah = 66h + 14h)                          
  15. 0775:001F B8004C        MOV        AX,4C00                           
  16. 0775:0022 CD21          INT        21                                 
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-23 17:20:02 | 显示全部楼层
jackz007 发表于 2019-5-22 11:19
sum1 紧随 array1 之后,占 2 个字节,sum2 紧随 array2 之后,占 2 个字节。
        所以:
   ...

谢谢啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 02:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表