当前位置: 首页 > article >正文

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

这阵子开始做汇编的微机实验(微机原理与接口技术题解及实验指导,吴宁版本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。


http://www.kler.cn/a/502890.html

相关文章:

  • PCB印刷电路板快速上手04电容元件
  • hutool糊涂工具通过注解设置excel宽度
  • python-42-使用selenium-wire爬取微信公众号下的所有文章列表
  • React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解
  • 用HTML + CSS实现太极图
  • HTML5实现好看的端午节网页源码
  • Pg之忘记密码重置【其他bug记录】
  • QT如何输出中文不乱码
  • 小型、中型无人机执照学习和考试区别详解
  • Microsoft Sql Server 2019 数据类型
  • C# 中的 Task 和 Async/Await
  • 网易云上显示的ip属地准吗?一次深度探讨‌
  • 《拉依达的嵌入式\驱动面试宝典》—Linux篇(三)_Linux 驱动编程
  • 数据分析-55-时间序列分析之获取时间序列的自然周期时间区间
  • 4、蓝牙打印机-定时器驱动
  • 热门力反馈手套对比,机器人遥操作完美解决方案
  • java通过ocr实现识别pdf中的文字
  • vue3学习日记5 - 项目起步
  • 自动化日常任务:使用Python和PyAutoGUI打开记事本并保存文本
  • WINFORM - DevExpress -> gridcontrol拖拽行记录排序
  • 容器化部署MySQL5.7数据库
  • 将Docker运行中的容器保存为镜像并导出导入
  • 移动 web :平面转换,渐变
  • AI多模态技术介绍:视觉语言模型(VLMs)指南
  • Docker安装和卸载(centos)
  • SOLID原则学习,接口隔离原则(Interface Segregation Principle, ISP)