Proteus-8086调试汇编格式的一点心得

打印 上一主题 下一主题

主题 1046|帖子 1046|积分 3138

这阵子开始做汇编的微机实验(微机原理与接口技术题解及实验指导,吴宁版本13章),中央出了挺多标题,解决后记录下。
先上电路图

用子电路来仿真发现仿真的时间子电路这块根本没有高低电平输出,只好把子电路拿出来连接了,有高手知道这块的话可以分享下解决办法。
下面是本身的一点经验。
Proteus内置汇编源代码调试,建议用这种布局
  1. CODE    SEGMENT PUBLIC 'CODE'
  2. MAIN PROC FAR
  3.         ASSUME CS:CODE, SS:SSEG
  4. START:
  5.         ; Write your code here
  6.                 MOV AX,SSEG
  7.                 MOV SS,AX
  8.                 ;这里输入代码
  9. .
  10. .
  11.         RET
  12. MAIN ENDP
  13. DELAY PROC
  14. .
  15. .
  16.                 RET
  17. DELAY ENDP
  18. CODE    ENDS
  19. SSEG SEGMENT
  20.                 DB 100 DUP(?)
  21. SSEG ENDS
  22.         END MAIN
复制代码
代码段写在前面,假如先写其他段,仿真时会出现,no source line at pc address pc=005D的标题,现在没找到解决办法。
但是代码段写在前面有个隐患,因为8086的内存Internal Memroy Size网上许多把他定义成0X10000,所以比如定义了堆栈段,SS被赋值成0003,然后主过程内里调用了一个子过程,SP=FFFE,那么LA=1002E,超出了10000的范围,所以RET的时间会出现,错误unknow 2-byte opcode at/unknow 1-byte opcode at,所以要把Internal Memroy Size设置大一点,比如0x20000。

不定义堆栈段也能调用子过程的谜团解开了
配景是我的8086的Internal Memroy Size定义成了0X10000,而且用了这段代码。
  1. CODE    SEGMENT PUBLIC 'CODE'
  2.         ASSUME CS:CODE;
  3. START:
  4.         ; Write your code here
  5.                 MOV DX, 1000H
  6. LP0:MOV BX,0E001H
  7. LP1:MOV AL, BL
  8.                 OUT DX,AL
  9.                 MOV AH,1
  10.                 CALL DELAY
  11.                 CMP BL,0
  12.                 JZ LP2
  13.                 ROL BX,1
  14.                 JMP LP1
  15. LP2:MOV AH,8
  16.                 CALL DELAY
  17.                 JMP LP0
  18. DELAY PROC
  19. AGAIN:MOV CX,30000
  20. D:        LOOP D
  21.                 DEC AH
  22.                 JNZ AGAIN
  23.                 RET
  24. DELAY ENDP
  25. CODE    ENDS
  26.         END START
复制代码
可以的看到这里堆栈段没有定义,仿真的时间可以调用近过程,没有报错。
原因是定义堆栈段的话,就在进子过程的时间系统按照SS和SP的值正常的压入断点,比如SS=0003H,SP=0000H,那么压入之后就变成,SP=FFFEH,物理地址LA=1002EH
而没有定义堆栈段的话,系统会以SS=0000H来压栈,所以SP=FFFEH,物理地址LA是0FFFEH。因为我之前把Internal Memroy Size定义成了0X10000的容量,所以刚好压在顶部,这里因为调用的是同代码段的近过程,所以只会压入IP,就是0FFFEH和0FFFFH这两个字节的值就是压入的IP。
假如容量没有这么大,比如设置成0x8000,刚进子过程系统主动压入IP的那步不会报错(这个不知道原因),子过程RET的时间会出现错误unknow 2-byte opcode at/unknow 1-byte opcode at,因为要出栈的地址已经超过了设置的内存地址了。

题外话:调用过程到底是只压入IP还是压入CS和IP?
调用远过程,都是压入CS和IP
调用近过程,在同一代码段内里,不管是在这种MAIN远过程内里调用,还是不写MAIN而是START做标号开始的这种常规代码内里调用,都只压入IP
调用近过程,在不同代码段,要压入CS和IP。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

络腮胡菲菲

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表