|
|
|
算法讲堂-》一维数组【源代码】(下载及演示部分会陆续推出) |
|
assume cs:code,ds:array_space,ss:stack
stack segment
db 36 dup(0)
stack ends
array_space segment
db 100 dup(0)
array_space ends
data segment
db '01234567289asdfghjklq132werttryuiop0'
data ends
code segment
start:
mov ax,array_space
mov ds,ax
mov si,0
;数组初始化
mov bl,0
mov ax,30
call array
;数组赋值
mov ax,data
mov es,ax
mov di,0
mov bl,4
call array
;数组根据给定值查找,第一个与之匹配的数据下标,在ax中
push si
mov bl,2
mov al,'2'
mov si,3
call array
pop si
;查找,数据在al中
mov bl,3
mov ax,10
call array
;用ah中的数据更新与al匹配的数组元素
mov ah,'+'
mov al,'0'
mov bl,5
call array
;更新下标为ax中的数据为dl中的数据
mov ax,10
mov dl,'*'
mov bl,6
call array
;统计与给定元素相匹配的个数
mov al,'4'
mov bl,7
call array
;数组清空
mov bl,8
call array
;数组销毁
mov bl,1
call array
mov ax,4c00h
int 21h
;*****************************************************************************************
;数组array的数据类型为byte型
;ds:数组的段地址
;si:数组的起始下标
;bl:数组的操作类型码:
;0:初始化
;ax:数组初始化大小
;1:销毁
;2:按值查找第一个,从给定下标开始
;al要查找的数据,参数
;si:从此下标开始查找
;ax:数据的下标 ,返回
;3:按下标查找
;ax:数组的下标,参数
;al:数据 ,返回
;4:数组赋值
;es:[di]:数据段的首地址
;ds:[si]:数组的起始地址
;5:按值所有与之匹配的更新
;al:给定值
;ah:目标数据
;6:按下标更新
;ax:指定的下标
;dl:目标数据
;7:统计与给定数据相同的元素个数
;al:给定的数据
;bx:元素个数
;8:清空数组
array:
jmp array_start
;数组最大值长度4K,此值是数据段的大小
ARRAY_MAX_LENGTH dw 104
;程序的入口地址
; address_array_start dw array_start
;数组方法的个数
array_method_num db 9
;数组的操作
array_method dw init,destroy,search_value,search_cursor,value,update_value,update_cursor,account_element,clear_element
;数组大小
array_size dw 0
;数组下标的最大值
array_index_max dw 0
;数组被初始化
array_is_inited dw 0
;数组被赋值
array_is_valued dw 0
;子函数中的标号地址
address_array_end dw array_end
array_start:
push ds
push si
push bx
cmp bl,array_method_num
ja method_num_over
mov bh,0
add bx,bx
jmp word ptr array_method[bx]
;玩家输入的操作方法不存在
method_num_over:
jmp word ptr address_array_end
;*********************************************************************
;0:初始化数组空间
;ax:数组的大小
;初始化结果为数组元素为'!'。
init:
;判断数组是否被初始化
cmp word ptr array_is_inited,1
je init_fail_inited
cmp ax,ARRAY_MAX_LENGTH
;如果申请的数组超过数组最大值长度4K,则申请失败
ja init_fail
;定义数组的大小
mov array_size,ax
mov array_index_max,ax
;数组下标的最大值,数组大小-1
sub word ptr array_index_max,1
push cx
mov cx,array_size
;初始化数组为空
init_clear:
mov byte ptr ds:[si],' '
inc si
loop init_clear
;标记数组已经被初始化
mov word ptr array_is_inited,1
pop cx
jmp short init_end
;显示数组已经被初始化,导致操作失败的信息
init_fail_inited:
jmp short init_end
init_fail:
;显示数组的初始化值大于数组默认的最大值,导致初始化数组失败的信息
jmp short init_end
init_end:
jmp word ptr address_array_end
;*********************************************************************
;1:销毁数组空间
;销毁数组的条件是存在已经被初始化的数组,即array_is_inited==1
destroy:
cmp word ptr array_is_inited,0
je destory_fail
mov word ptr array_size,0
mov word ptr array_index_max,0
mov word ptr array_is_inited,0
mov word ptr array_is_valued,0
jmp short destory_end
destory_fail:
jmp short destory_end
destory_end:
jmp word ptr address_array_end
;*********************************************************************
;2:按值查找第一个,从给定下标开始,并返回索引值
;al要查找的数据,参数
;si:从此下标开始查找
;ax:数据的下标 ,返回
;查找数组的条件是数组已经被赋值,即array_is_valued==1
search_value:
cmp word ptr array_is_valued,0
je search_value_fail
cmp si,array_index_max
ja search_index_over
;查找的数据在al中
search_loop:
cmp ds:[si],al
je search_element
inc si
cmp si,array_index_max
;查找到数组尾
je search_element
jmp short search_loop
search_index_over:
jmp short search_end
search_element:
mov ax,si
jmp short search_end
search_value_fail:
jmp short search_end
search_end:
jmp word ptr address_array_end
;*********************************************************************
;3:返回指定索引下标的元素值
;ax:数组的下标,参数
;al:数据 ,返回
;查找数组的条件是数组已经被赋值,即array_is_valued==1
search_cursor:
cmp word ptr array_is_valued,0
je search_cursor_fail
;下标值超过数组的大小,返回
cmp ax,array_index_max
ja search_cursor_over
mov si,ax
mov al,ds:[si]
jmp search_cursor_success
search_cursor_fail:
jmp search_cursor_end
search_cursor_over:
jmp search_cursor_end
search_cursor_success:
jmp search_cursor_end
search_cursor_end:
jmp word ptr address_array_end
;*********************************************************************
;4:数组赋值
;es:[di]:数据段的首地址
;ds:[si]:数组的起始地址
;此操作的前提条件是数组要被初始化,即array_is_inited==1
value:
push cx
push ax
push di
cmp word ptr array_is_inited,0
je value_fail
cmp word ptr array_is_valued,1
je valued_fail
mov cx,array_size
value_loop:
mov al,es:[di]
mov ds:[si],al
;显示赋值过程
inc di
inc si
loop value_loop
;标记数组已经被赋值
mov word ptr array_is_valued,1
jmp short value_end
value_fail:
jmp short value_end
valued_fail:
jmp short value_end
value_end:
pop di
pop ax
pop cx
jmp word ptr address_array_end
;*********************************************************************
;5:更新所有和给定值相同的数据元素
;al:给定值
;ah:目标数据
;查找数组的条件是数组已经被赋值,即array_is_valued==1
update_value:
push cx
push dx
push di
cmp word ptr array_is_valued,0
je update_value_fail
mov cx,array_size
update_value_loop:
cmp ds:[si],al
je update
goto_loop:
inc si
loop update_value_loop
jmp short update_value_end
update:
mov ds:[si],ah
jmp short goto_loop
update_value_fail:
jmp short update_value_end
update_value_end:
pop di
pop dx
pop cx
jmp word ptr address_array_end
;*********************************************************************
;6:更新指定下标的元素
;ax:指定的下标
;dl:目标数据
;查找数组的条件是数组已经被赋值,即array_is_valued==1
update_cursor:
cmp word ptr array_is_valued,0
je update_cursor_fail
cmp ax,array_size
ja update_cursor_over
;根据元素位置计算显示的行和列
mov si,ax
mov ds:[si],dl
jmp short update_cursor_end
update_cursor_over:
jmp short update_cursor_end
update_cursor_fail:
jmp short update_cursor_end
update_cursor_end:
jmp word ptr address_array_end
;*********************************************************************
;统计与给定数据相同的元素个数
;al:给定的数据
;bx:元素个数
;查找数组的条件是数组已经被赋值,即array_is_valued==1
account_element:
push cx
cmp word ptr array_is_valued,0
je account_element_fail
mov bx,0
mov cx,array_size
account_element_loop:
cmp ds:[si],al
je inc_account_element
goto_account:
inc si
loop account_element_loop
jmp short account_element_end
inc_account_element:
inc bx
jmp short goto_account
account_element_fail:
jmp short account_element_end
account_element_end:
pop cx
jmp word ptr address_array_end
;*********************************************************************
;清空数组
;查找数组的条件是数组已经被赋值,即array_is_valued==1
clear_element:
push cx
cmp word ptr array_is_valued,0
je clear_element_fail
mov cx,array_size
;初始化数组为空
clear_clear:
mov byte ptr ds:[si],' '
inc si
loop clear_clear
mov word ptr array_is_valued,0
jmp short clear_element_end
clear_element_fail:
jmp short clear_element_end
clear_element_end:
pop cx
jmp word ptr address_array_end
;*********************************************************************
array_end:
pop bx
pop si
pop ds
ret
;*****************************************************************************************
code ends
end start
[07/09/21] | |
|