汇编实验二——选出非负数以及排序
一、实验要求
- 筛选
要求将first行中的非负数选出到second行。 - 排序
要求将second行中的数据按升序重新排列。
二、实现原理
1、筛选
选出非负数的方式很多,介绍常用的方式。
(1)比较指令
直接将数值与 0 比较:CMP AL,0
CF=0,表示大于等于 A>=B
CF=1,表示小于 A<B
用JC/JNC判断条件
(2)左移指令(逻辑、算数都可以)
判断一个数是不是负数,对于有符号数来说,8 位二进制以补码记录,所以第一位是 1:SHL AL,1
(逻辑左移)
CF=0,表示为 非负数
CF=1,表示为 负数
用JC/JNC判断条件
(3)测试指令
同(2)理,用数值和 10000000B 左与运算,判断第一位为 1 还是 0:TEST AL,10000000B
结果为0,表示为 非负数
结果为1,表示为 负数
用JZ/JNZ判断条件
2、排序
排序算法有很多,我就以选择排序法来说。
一共13个数,那么从第一个开始比较,如果第一个比比较的数大,那么交换,得到最小的数,需要比较12次。
然后第一轮结束,第二轮从第二个开始,要比较11次
…
所以外循环要比较12次,内循环根据外循环次数同样减少。
三、代码及解释
1、N EQU $-FIRST 是指将 FIRST 的字节数赋给常数 N
−−−−取当前的偏移地址FIRST−−−−这里的FIRST是指取它的首字节的偏移地址所以,----取当前的偏移地址 FIRST ----这里的FIRST 是指取它的首字节的偏移地址 所以,−−−−取当前的偏移地址FIRST−−−−这里的FIRST是指取它的首字节的偏移地址所以,-FIRST 是指 获取内存缓冲区FIRST 的尺寸(size),即字节数。
2、排序前没有记录非负数个数,直接数的13个,直接给的值
stack SEGMENT PARA stackDB 10 DUP('?')
stack ENDSseg1 SEGMENTfirst DB 5,-8,3,9,-2,-5,7,-9,0,5,4,9,-6,1,-1,8,-3,6,2,-7,0,-4N EQU $-FIRSTsecond DB 30 DUP('?')
seg1 ENDSseg2 SEGMENTASSUME DS:seg1,CS:seg2,SS:stack
;(2)复制,选出非负数
start: MOV AX,seg1MOV DS,AXLEA SI,firstLEA DI,secondMOV CX,N ;循环次数LLP: MOV AL,[SI]Test AL,10000000bJNZ GO MOV [DI],ALINC DIGo: INC SILOOP LLP; start:MOV AX,seg1; MOV DS,AX; MOV CX,16H; MOV SI,OFFSET first; MOV DI,OFFSET second; SELECT: MOV AL,[SI]; MOV DL,AL; SHL AL,1; JNC FOUND ;左移判断CF,正负; INC SI; LOOP SELECT; FOUND: MOV [DI],DL; INC SI; INC DI; LOOP SELECTINT 21H
;(3)second排序,选择排序法MOV CX,0CH ;循环12SORT: PUSH CX ;入栈,保存CXMOV SI,OFFSET secondINNER: MOV AL,[SI] CMP AL,[SI+1]JBE NOSWAP ;低于等于转,说明不需要交换,直接后面继续比较XCHG AL,[SI+1] ;交换MOV [SI],ALNOSWAP: INC SI ;SI+1,LOOP INNERPOP CX ;出栈,恢复CXLOOP SORTINT 21H
seg2 ENDSEND start
四、结果
1、筛选调式
-u :查看反编译序号
-g 001c:直接执行到筛选结束
-d ds:0000 :查看结果
-d ds:0016 :查看结果
2、排序
-u :查看反编译序号
-g 0037:直接执行到筛选结束
-d ds:0000 :查看结果
-d ds:0016 :查看结果
汇编实验二——选出非负数以及排序相关推荐
- 分支程序与循环程序设计-汇编实验二
DATA SEGMENT ;定义数据段BUF DB -1, 20, 3, 30, -5, 15, 100, -54, 0, 4, 78, 99DB -12, 32, 3, 23, -7, 24, 60 ...
- CSAPP_实验二 拆炸弹 汇编知识应用
CSAPP--实验二 拆炸弹 Phase1 disas phase_1, 反汇编 phase_1 函数 在 phase_1函数入口处 设置断点 break phase_1 run 开始运行,输入字符串 ...
- CSAPP实验二——bomb lab实验
CSAPP实验二-- bomb lab实验 实验前准备 第一部分(phase_1) 第二部分(phase_2) 第三部分(phase_3) 第四部分(phase_4) 第五部分(phase_5) 第六 ...
- 哈工大计算机系统实验二——DataLab数据表示
计算机系统实验二特别难,和上一届的实验不一样,没有学长的火炬,当时做的时候特别崩溃.幸好有一帮志同道合的伙伴们,一起慢慢把实验解决了. 把火炬传下去! 实验报告 实 验(二) 题 目 Data ...
- 20172328《程序设计与数据结构》实验二:树
20172328<程序设计与数据结构>实验二:树 课程:<软件结构与数据结构> 班级: 1723 姓名: 李馨雨 学号:20172328 实验教师:王志强老师 实验日期:201 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示
实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...
- 0421实验二 作业调度模拟程序
实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调 ...
- R语言入门第三集 实验二:基本数据处理
R语言入门第三集 实验二:基本数据处理 一.资源 [R语言]R语言数据处理--东北大学大数据班R实训第二次作业 二.答案更新纠正 2.11.从df中选取date . item_id . cate_id ...
- 20172319 实验二《树》实验报告
20172319 2018.11.04-11.12 实验二<树> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:20172319 ...
- 【操作系统】实验二 作业调度模拟程序
实验二作业调度模拟程序 一.目的和要求 1. 实验目的 (1)加深对作业调度算法的理解: (2)进行程序设计的训练. 2.实验要求 用高级语言编写一个或多个作业调度的模拟程序. 单道批处理系统的作业调 ...
最新文章
- 京东金融晒 “打黑成绩单”:一年内避免用户损失上亿元
- WEB--一个不错的想法
- 【迁移学习(Transfer L)全面指南】CVPR(2020)元学习、小样本、领域自适应、领域泛化和迁移学习概述
- 文本编辑器左边显示行数
- 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业...
- 项目: 图书管理系统 【C++ / C】
- C#中对象的序列化与反序列化
- 多媒体开发之wis-stream
- RTTI机制(运行时类型识别)
- MySQL基础一些概念一些用法
- wps文档一敲空格就换行_wps敲空格变成点
- 跨界营销策划案例合集(共13份)
- Java编写五线谱上的音符_五线谱入门(三)——音符详解
- 初识Zigbee协议栈及其安装
- CDA LEVELⅠ2021新版模拟题一(附答案)
- Qt —— 录制麦克风、扬声器的声音
- 微信小程序商城API文档
- 5G无线关键技术 — 双工技术
- Switch使用方法
- 云解析DNS使用教程
热门文章
- 帝国cms没有标题图片就显示默认图片
- python批量注释快捷键wingide_WingIDE 常用快捷键
- python正负数转换_python – 将正/负数舍入到最接近的“整数”
- Error: The project seems to require yarn but it‘s not installed.
- 腾讯会议使用OBS虚拟摄像头
- 虚拟摄像头/无人直播效果分析,可替抖音/微信
- 名企招聘面试考题集锦
- nio中的Files类常用方法
- json parser类的使用
- h5 app开发 教程