微机原理8086汇编语言上机——Masm环境搭建与常用汇编调试指令
程序员文章站
2022-07-03 14:16:09
...
学校的微机原理与接口技术课,最近开始 考古 上机实验了。
1.弯路
为什么不用宇宙最强大的IDEL——Visual Studio呢?
在我的Visual Studio专栏中有一篇文章介绍Visual Studio搭建汇编语言环境并使用AsmDude插件实现代码高亮。
本地windows调试器,启动!
折腾了一下午,原因找到了:8086微机使用的16位系统,而VS环境是32位的,一个32位的数据传给一个应该是16位的数据,当然符号类型冲突。
放弃了Visual Studio。也许有人会解决这个问题?
2.推荐的MASM
使用DOS系统也不尽人意,改用学校推荐的Masm集成开发环境,360软件管家即可下载:
下载安装敲代码一气呵成:
STACK SEGMENT STACK
DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H
DB 0B8H,0B9H
DB 0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
DB 10H DUP(00)
STACK ENDS
DATA1 SEGMENT
DB 0A0H,0A1H,0A2H,0A3H
TABLE DW 0A5A4H
DB 0A6H,0A7H,0A8H,0A9H,0AAH,0ABH
DB 0ACH,0ADH,0AEH,0AFH
DATA1 ENDS
DATA2 SEGMENT
DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H
DB 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH
DATA2 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA1,ES:DATA2,SS:STACK
START:MOV AX,DATA1
MOV DS,AX
MOV AX,DATA2
MOV ES,AX
MOV AX,STACK
MOV SS,AX
MOV BX,0004H
MOV CX,0005H
MOV BP,0003H
MOV SI,0002H
MOV DI,0001H
MOV AX,CX ;寄存器寻址,0005H
MOV AX,500H ;立即寻址,500H
MOV AX,TABLE ;直接寻址,DS:0004H, 0A5A4H
MOV AX,ES:[BX] ;寄存器间接寻址,ES:0004H, 0C5C4H
MOV AX,[BX+05H] ;寄存器相对寻址,DS:0009H, 0AAA9H
MOV AX,SS:[BX]+03H ;寄存器相对寻址,SS:0007H, 0B8B7H
MOV AX,TABLE[BX] ;寄存器相对寻址,DS:0008H, 0A9A8H
MOV AX,07H[BX] ;寄存器相对寻址,DS:000BH, 0ACABH
MOV AX,[BP] ;寄存器相对寻址,SS:0003H, 0B4B3H
MOV AX,TABLE[BP] ;寄存器相对寻址,DS:0007H, 0A8A7H
MOV AX,08H[BP] ;寄存器相对寻址,SS:000BH, 0BCBBH
MOV AX,[BP+06H] ;寄存器相对寻址,SS:0009H, 0BAB9H
MOV AX,DS:[BP+03H] ;寄存器相对寻址,DS:0006H, 0A7A6H
MOV AX,[BP]+05H ;寄存器相对寻址,SS:0008H, 0B9B8H
MOV AX,ES:[SI+03H] ;寄存器相对寻址,ES:0005H, 0C6C5H
MOV AX,[DI+06H] ;寄存器相对寻址,DS:0007H, 0A8A7H
MOV AX,[DI]+05H ;寄存器相对寻址,DS:0006H, 0A7A6H
MOV AX,TABLE[SI] ;寄存器相对寻址,DS:0006H, 0A7A6H
MOV AX,[SI] ;寄存器间接寻址,DS:0002H, 0A3A2H
MOV AX,TABLE[DI] ;寄存器相对寻址,DS:0005H, 0A6A5H
MOV AX,[SI]+05H ;寄存器相对寻址,DS:0007H, 0A8A7H
MOV AX,[BX][DI+01H] ;基址变址且相对寻址,DS:0006H, 0A7A6H
MOV AX,[BX][SI]+03H ;基址变址且相对寻址,DS:0009H, 0AAA9H
MOV AX,TABLE[BX][SI] ;基址变址且相对寻址,DS:000AH, 0ABAAH
MOV AX,ES:[BX][DI] ;基址变址寻址,ES:0005H, 0C6C5H
MOV AX,[BP][DI+02H] ;基址变址且相对寻址,SS:0006H, 0B7B6H
MOV AX,TABLE[BP][DI] ;基址变址且相对寻址,DS:0008H, 0A9A8H
MOV AX,ES:[BP][DI] ;基址变址寻址,ES:0006H, 0C5C4H
MOV AX,[BP][SI+05H] ;基址变址且相对寻址,SS:000AH, 0BBBAH
MOV AX,03H[BP][DI] ;基址变址且相对寻址,SS:0007H, 0B7B6H
MOV AX,[BP][SI] ;基址变址寻址,SS:0005H, 0B6B5H
MOV AX,[BP+02H][DI+03H] ;基址变址且相对寻址,SS:0009H, 0BAB9H
MOV AX,TABLE[BP+02H][DI+03H];基址变址且相对寻址,DS:000DH, 0AEADH
MOV AH,4CH
INT 21H
CODE ENDS
END START
我怎么没找到markdown语言里支持汇编语言高亮的代码块?求教
先点红框里的运行果然剽现成的代码就是爽
程序字体模糊和字体过小等问题,可以看我的Windows小技巧专栏里的相关文章。
3.调试
接着拿学校给的东西做,点击红框里的调试,进入调试模式。输入-r 不区分大小写,可以看到所有寄存器的值。
常用汇编调试指令如下表:
命令名 | 格式 | 功能 |
---|---|---|
R | 格式1:R 格式2:R 寄存器名 |
显示修改寄存器的内容 |
U | 格式1:U [地址] 格式2:U 地址范围 |
从指定地址开始反汇编 |
D | 格式1:D[地址] 格式2:D 地址范围 |
显示地址范围内的内存单元内容 |
E | 格式:E 地址 [数据] |
把给定的数据送到指定地址开始连续的内存单元中 |
T | 格式: T [=地址][x] | 从指定的地址开始跟踪x条指令 |
N | 格式: N [磁盘][路径]文件名 | 在指定的盘,路径下建立文件 |
G | 格式: G [=地址][断点] | 从指定地址开始执行程序,到断点处停下来 |
W | 格式: W [地址] | 从地址开始的内存块写文件 |
L | 格式: L [地址] | 将N命令指定的文件调入指定的内存地址 |
A | 格式: A [地址] | 从指定地址开始,对输出的语句汇编到内存 |
P | 格式: P [=地址][x] | 执行一个循环直到中断,x代表执行循环的次数 |
Q | 格式: Q | 结束并退出DEBUG程序 |
I | 格式: I 端口地址 | 从指定的端口地址读一个字节,并显示出来 |
O | 格式: O 端口地址 值 | 将值送到指定端口 |
实际我们只用到了-T指令,一直-T,看寄存器的值并记录……
今天的重点:MOV AX, [BP] 是寄存器相对寻址,原因是书上的寄存器直接寻址里没有BP寄存器……
资料源自学校微机课程教研组,如有侵权请联系删除。