上机3-1

找出一个字节数组中最大数和最小数,分别存入 MAX 和 MIN 单元中(假设字节数组为
45,98,63,78,88,101,89,65,100)

代码1

data segment
array db 45,98,63,78,88,101,89,65,100
max db 0
min db 0
data ends

code segment
assume cs:code,ds:data
start:  
	mov ax,data
    mov ds,ax

    mov cx,9
	mov si,offset array
	mov al,array[si]
	mov max,al
	mov min,al

lop:	
	cmp cx,1
	jae big
	jmp exit

big:	
	inc si
	mov al,max
	mov bl,min
	cmp array[si],al
	ja ch1
	cmp bl,array[si]
	ja ch2

ch1:	
	mov al,array[si]
	mov max,al
	dec cx
	jmp lop

ch2:	
	mov al,array[si]
	mov min,al
	dec cx
	jmp lop

exit:   	
	mov ax,4c00h
    int 21h
code ends
end start

代码2

.model small
.386
.data
array db 45, 98, 63, 78, 88, 101, 89, 65, 100
N equ $-array
max db ?
min db ?

.code
start:  
	mov ax, @data
	mov ds, ax              ; 
	mov si, 0
	mov cx, N
	mov al, array[si]       ; 初始化最小值(临时存储在 al)
	mov ah, al              ; 初始化最大值
	inc si                  ; 跳过第一个初始值
	sub cx, 1
;------------------------------------------ 循环(cx 控制有问题;这里loop跳出后不应该再执行loop,顺序问题)
next:   
	jcxz ext                ; 在 si = 数组长度(N) - 1 时跳出循环

	cmp ah, array[si]       ; ah 小于 数组元素
	jb newMax

	cmp al, array[si]       ; al 大于 数组元素
	ja newLess
	
	inc si
	loop next
;------------------------------------------ 新最大值
newMax: 
	jcxz ext                ; 在 si = 数组长度(N) - 1 时跳出循环
	mov ah, array[si]
	inc si
	loop next
;------------------------------------------ 新最小值
newLess:
	jcxz ext                ; 在 si = 数组长度(N) - 1 时跳出循环
	mov al, array[si]
	inc si
	loop next
;------------------------------------------ 转移最值
ext:    
	mov max, ah
	mov min, al
	mov ax, 4c00h
	int 21h
end start

上机3-2

统计字变量 X 中的各位有多少个 1,并将结果存入到 NUM 单元中(假设 X=97B4H)

代码1

data segment
x dw 97B4H
num db ?
data ends

code segment
assume cs:code,ds:data
start:  
	mov ax,data
    mov ds,ax

    mov bl,0
	mov cx,16

s:	
	shl x,1
	jc ch1
	loop s
	jmp exit

ch1:	
	inc bl
	loop s
	jmp exit

exit:	
	mov num,bl
	
    mov ax,4c00h
    int 21h
code ends
end start

代码2

.model small
.386
.data
x dw 97b4h
num db ?

.code
start:  
	mov ax, @data
	mov ds, ax      ;
	mov ax, x
	mov cx, 10h     ; 16次,因为16位
;------------------------------------------
next:   
	jcxz ext
	shl ax, 1       ; 左移 1 位
	jc one          ; CF = 1 时加 1
	loop next
;------------------------------------------ 加 1
one:    
	jcxz ext
	inc num
	loop next
;------------------------------------------ 转移最值
ext:    
	mov ax, 4c00h
    int 21h
end start

上机4

根据成绩数组 score 中保存的 10 个学生的成绩,统计相应学生的名次并填入名次数组 rank 中(假设 10 名学生的成绩为 80,60,49,86,100,79,85,86,99,59)

代码1

data segment
score dw 80,60,49,86,100,79,85,86,99,59
rank dw 10 dup(?)
data ends

code segment
assume cs:code,ds:data
start:  
	mov ax,data
    mov ds,ax

	mov cx,10
	mov si,0
	mov rank[si],0	;//方便查看rank数组结果

lp1:	
	push cx			
	mov cx,10
	mov bx,0
	mov ax,score[si]
	mov di,0

lp2:
	cmp score[di],ax
	ja con
	add di,2
	loop lp2
	jmp lp

con:
	inc bx
	add di,2
	loop lp2
	jmp lp

lp:	
	inc bx
	mov rank[si],bx
	add si,2
	pop cx			
	loop lp1

    mov ax,4c00h
   	int 21h
code ends
end start

代码2

.model small
.386

.data
	array dw 80, 60, 49, 86, 100, 79, 85, 86, 99, 59
	N equ ($-array)/2
rank dw N dup(1)

.stack

.code
start:  
	mov ax, @data
	mov ds, ax      ;

	mov cx, N
	mov si, 0
	mov bx, 0       ; 临时存储数组下标
;------------------------------------------ 遍历数组(外循环)
next:   
	mov ax, array[si]
	mov bx, si              ;

	push cx                 ; cx 先入栈(意味着 cx 后出栈)
	push si
	mov cx, N
	mov si, 0
;------------------------------------------ 比较得排名(内循环)
inNext:
	cmp ax, array[si]
	jb newRank
	add si, 2               ; array 存储的是字数据,所以 si 自增 2 来移动到下一个 array 的元素
	loop inNext
	jcxz util               ; cx = 0 时,跳转至下一次外循环的准备工作
;------------------------------------------ 排名
newRank:
	inc rank[bx]
	jcxz util               ; cx = 0 时,对最后一个数排名后,跳至下一个外循环的准备工作
	add si, 2
	loop inNext
;------------------------------------------ 内循环完成后的处理工作
util:   
	pop si                  ; 后进先出
	pop cx
	add si, 2
	loop next
;------------------------------------------ 
	mov ax, 4c00h
	int 21h
end start