本实验使用vscode+插件编写汇编代码和调试(点击查看教程)
实验内容
设DATA1开始的内存单元中,存放着一串带符号字数据,要求采用排序算法(可选择,需指明采用哪种)按照从小到大的顺序排序并将排好序的数据存在DATA2开始的单元。
(选做)用C语言完成相同功能的程序(数据类型可用int),分别对其进行选项为-O1和-O2的优化,对比反汇编的程序及直接用汇编语言编写的程序(共3个,用表格列出)。
实验结果
本实验只做了排序,使用的是冒泡排序,并没有做选做内容
数据段内容(8个有符号字数据)
DSEG SEGMENT
DATA1 DW 8,43,11,-25,1,31,65,99;数据单元
DATA2 DW 8 DUP(0);结果单元
DSEG ENDS
空白处右键选debug调试
可以看到内存中DATA1中的8个数据和DATA2中的8个0(都是小端法存储)
输入g,然后再次查看内存,DATA1中的数据从小到大排序并保存到DATA2中
源代码
DSEG SEGMENT
DATA1 DW 8,43,11,-25,1,31,65,99;数据单元
DATA2 DW 8 DUP(0);结果单元
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
BEGIN:
MOV AX,DSEG
MOV DS,AX;将DSEG赋值为数据段
MOV ES,AX;将DSEG赋值为附加段
MOV CX,8;冒泡排序外层循环次数
OUTFOR:
MOV BX,0;内层循环变量初值为0
LEA SI,DATA1;取DATA1首地址
INFOR:
MOV AX,[SI];将SI所指元素赋值给AX
CMP AX,[SI+2];比较AX和下一个值的大小
JLE LEN;AX小于等于下一个值跳转
MOV DX,[SI+2];AX大于下一个值,则两个值交换
MOV [SI],DX
MOV [SI+2],AX
LEN:ADD SI,2;SI加2,指向下一个值
INC BX
CMP BX,CX;比较BX和CX,判断内层循环是否结束
JB INFOR;小于则跳转,继续比较,直至内层循环结束
LOOP OUTFOR;CX-1,CX不等于0跳转继续外循环,等于0则冒泡排序结束,保存结果
MOV CX,8;将排序后的结果传送到DATA2单元
LEA SI,DATA1
LEA DI,DATA2
CLD;DF标志位清零
REP MOVSW;重复执行
MOV AX,4C00H;结束
INT 21H
CSEG ENDS;代码段结束
END BEGIN
感谢大家的观看