汇编实验二——选出非负数以及排序

一、实验要求

  1. 筛选
    要求将first行中的非负数选出到second行。
  2. 排序
    要求将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
F I R S T F I R S T ----取当前的偏移地址 FIRST ----这里的FIRST 是指取它的首字节的偏移地址 所以, -FIRST 是指 获取内存缓冲区FIRST 的尺寸(size),即字节数。

2、排序前没有记录非负数个数,直接数的13个,直接给的值

stack	SEGMENT PARA stack
		DB 10 DUP('?')
stack	ENDS
		
seg1	SEGMENT
		first  DB 5,-8,3,9,-2,-5,7,-9,0,5,4,9,-6,1,-1,8,-3,6,2,-7,0,-4
		N EQU $-FIRST
		second DB 30 DUP('?')
seg1	ENDS

seg2	SEGMENT
		ASSUME	DS:seg1,CS:seg2,SS:stack
;2)复制,选出非负数
start:	MOV	AX,seg1
		MOV	DS,AX
		LEA SI,first
        LEA DI,second
        MOV CX,N			;循环次数
		
LLP:    MOV AL,[SI]
        Test AL,10000000b
        JNZ GO 
        MOV [DI],AL
        INC DI
		
Go:     INC SI
        LOOP 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 SELECT
		
		INT 21H
;3)second排序,选择排序法
		MOV CX,0CH			;循环12

SORT:	PUSH CX				;入栈,保存CX
		MOV SI,OFFSET second
		
INNER:	MOV AL,[SI]		
		CMP AL,[SI+1]
		JBE NOSWAP			;低于等于转,说明不需要交换,直接后面继续比较
		XCHG AL,[SI+1]		;交换
		MOV [SI],AL
		
NOSWAP:	INC SI				;SI+1,
		LOOP INNER
		POP CX				;出栈,恢复CX
		LOOP SORT
		
		INT 21H
seg2	ENDS
		END	start

四、结果

1、筛选调式

-u :查看反编译序号
-g 001c:直接执行到筛选结束
-d ds:0000 :查看结果
-d ds:0016 :查看结果

在这里插入图片描述
2、排序

-u :查看反编译序号
-g 0037:直接执行到筛选结束
-d ds:0000 :查看结果
-d ds:0016 :查看结果

在这里插入图片描述

发布了113 篇原创文章 · 获赞 109 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_42109012/article/details/102924922
今日推荐