这阵子开始做汇编的微机实验(微机原理与接口技术题解及实验指导,吴宁版本13章),中央出了挺多标题,解决后记录下。
先上电路图
用子电路来仿真发现仿真的时间子电路这块根本没有高低电平输出,只好把子电路拿出来连接了,有高手知道这块的话可以分享下解决办法。
下面是本身的一点经验。
Proteus内置汇编源代码调试,建议用这种布局
- CODE SEGMENT PUBLIC 'CODE'
- MAIN PROC FAR
- ASSUME CS:CODE, SS:SSEG
- START:
- ; Write your code here
- MOV AX,SSEG
- MOV SS,AX
- ;这里输入代码
- .
- .
- RET
- MAIN ENDP
- DELAY PROC
- .
- .
- RET
- DELAY ENDP
- CODE ENDS
- SSEG SEGMENT
- DB 100 DUP(?)
- SSEG ENDS
- 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,而且用了这段代码。
- CODE SEGMENT PUBLIC 'CODE'
- ASSUME CS:CODE;
- START:
- ; Write your code here
- MOV DX, 1000H
- LP0:MOV BX,0E001H
- LP1:MOV AL, BL
- OUT DX,AL
- MOV AH,1
- CALL DELAY
- CMP BL,0
- JZ LP2
- ROL BX,1
- JMP LP1
- LP2:MOV AH,8
- CALL DELAY
- JMP LP0
- DELAY PROC
- AGAIN:MOV CX,30000
- D: LOOP D
- DEC AH
- JNZ AGAIN
- RET
- DELAY ENDP
- CODE ENDS
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |