上机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