|
|
|
算法讲堂-》二维数组【源代码】(下载及演示部分会陆续推出) |
|
;二维数组
assume cs:code,ds:array_space,ss:stack
stack segment
dw 24 dup(0)
stack ends
array_space segment
dw 60 dup(0)
array_space ends
array_data segment
Copyright db 'Copyright (c) 2007 www.asmedu.net','$'
arrayData db 'abacbcbdcdcededfefegfgehghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrrsrtstsututvuvuwvwvxwwxwyxxzyzz'
array_data ends
code segment
;*****************************************************************************************
start:
mov ax,array_space
mov ds,ax
mov si,0
;初始化
mov bl,0
mov ah,5
mov al,10
call array
;赋值
mov ax,array_data
mov es,ax
mov di,offset arrayData
mov bl,2
call array
;根据给定值查找
mov al,'b'
mov ah,'d'
mov bl,4
call array
;根据给定下表查找
mov dl,0
mov dh,0
mov bl,5
call array
;修改与给定元素匹配的所有元素
mov ah,'c'
mov al,'a'
mov dh,'0'
mov dl,'0'
mov bl,6
call array
;修改给定下标的元素,
mov dl,4
mov dh,9
mov ah,'-'
mov al,'+'
mov bl,7
call array
;8:统计给定元素数量
mov al,'a'
mov ah,'b'
mov bl,8
call array
;清空数组
mov bl,3
call array
;销毁数组
mov bl,1
call array
mov ax,4c00h
int 21h
;*****************************************************************************************
;二维数组的各种操作方法实现,数组元素大小为1个字单元
;ds:[si]:数组空间的首地址
;bl:操作方法的选择
;0:初始化
;ah:数组的行数
;al:数组的列数
;1:销毁
;2:赋值
;es:[di]数据首地址
;3:清空;
;4:根据给定值查找
;ax:指定的元素
;dx:元素的下标值,返回
;5:根据给定的下标查找
;dl:指定行
;dh:指定列
;dx:指定位置的元素,返回
;6:修改与给定元素匹配的所有元素
;ax:更新元素
;dx:目标元素
;7:修改给定下标的元素
;dh:指定行
;dl:指定列
;ax:目标元素
;8:统计给定元素数量
;ax:指定元素
;bp:元素的个数,返回值
array:jmp array_start
;数组操作方法的种类数量和
array_method_num db 9
;数组各种方法的入口地址
array_method dw init,destory,evaluate,clear,search_element,search_cursor,update_element,update_cursor,statistic_element
;数组子函数结束地址
array_end_address dw array_end
;数组的最大值(字节数)
array_length_max db 200
;数组被初始化标志
array_inited db 0
;数组被赋值的标志
array_evaluated db 0
;数组元素占2个存储单元
array_element_size db 2
;数组的行
array_row db 0
;数组的列
array_col db 0
;用于存放临时数据的单元
array_temp dw 0
array_start:
push si
push bx
cmp bl,array_method_num
ja array_method_over
mov bh,0
add bx,bx
jmp word ptr array_method[bx]
;输入的数组操作方法越界
array_method_over:
jmp word ptr array_end_address
;数组初始化
;ah:数组的行数
;al:数组的列数
init:
;计算数组空间的大小==ah*al
push ax
push cx
push bx
;判断数组是否被初始化
cmp byte ptr array_inited,1
je init_fail_temp
jmp short init_fail_next
init_fail_temp:
jmp init_fail
init_fail_next:
mov array_temp,ax
mul ah
mov ah,array_element_size
mul ah
;比较数组空间与数组空间最大值
cmp al,array_length_max
ja init_over_temp
jmp init_over_next
init_over_temp:
jmp init_over
init_over_next:
mov ax,array_temp
;设置数组的行列值
mov array_row,ah
mov array_col,al
;初始化元素值
;初始化行
mov ch,0
mov cl,array_row
init_row_loop:
push cx
push ax
push si
;初始化列
mov ch,0
mov cl,array_col
init_col_loop:
push cx
push si
mov ch,0
;元素大于1个存储单元
mov cl,array_element_size
init_element_loop:
;元素为空
mov byte ptr ds:[bx+si],' '
inc si
loop init_element_loop
pop si
pop cx
mov al,array_element_size
mov ah,0
add si,ax
loop init_col_loop
;计算一列占的存储空间大小
mov al,array_element_size
mul byte ptr array_col
add bx,ax
pop si
pop ax
pop cx
loop init_row_loop
mov byte ptr array_inited,1
jmp short init_end
;数组已经被初始化,导致操作失败
init_fail:
jmp short init_end
;数组空间大于数组空间的最大值
init_over:
jmp short init_end
init_end:
pop bx
pop cx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;销毁数组
destory:
;判断数组是否被初始化
cmp byte ptr array_inited,0
je destory_fail
mov byte ptr array_row,0
mov byte ptr array_col,0
mov byte ptr array_temp,0
mov byte ptr array_inited,0
mov byte ptr array_evaluated,0
jmp short destory_end
;数组未被初始化导致操作失败
destory_fail:
jmp short destory_end
destory_end:
jmp word ptr array_end_address
;*********************************************************************
;数组赋值
evaluate:
push ax
push bx
push cx
push di
push si
;判断数组是否被初始化
cmp byte ptr array_inited,0
je evaluate_fail_inited
;判断数组是否被赋值
cmp byte ptr array_evaluated,1
je evaluate_fail_evaluated
;数组赋值
mov bx,0
;行赋值
mov ch,0
mov cl,array_row
evaluate_row_loop:
push cx
push ax
push si
push di
;列赋值
mov ch,0
mov cl,array_col
evaluate_col_loop:
push cx
push si
push di
mov ch,0
;元素大于1个存储单元
mov cl,array_element_size
evaluate_element_loop:
;元素赋值
mov ah,es:[bx+di]
mov ds:[bx+si],ah
inc si
inc di
loop evaluate_element_loop
pop di
pop si
pop cx
mov al,array_element_size
mov ah,0
add si,ax
add di,ax
loop evaluate_col_loop
;计算一列占的存储空间大小
mov al,array_element_size
mul byte ptr array_col
add bx,ax
pop di
pop si
pop ax
pop cx
loop evaluate_row_loop
mov byte ptr array_evaluated,1
jmp short evaluate_end
;数组未被初始化,导致操作失败
evaluate_fail_inited:
jmp short evaluate_end
;数组已经赋值,导致操作失败
evaluate_fail_evaluated:
jmp short evaluate_end
evaluate_end:
pop si
pop di
pop cx
pop bx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;清空数组
clear:
push ax
push bx
push cx
;判断是否被初始化
cmp byte ptr array_inited,0
je clear_fail_noInited
;判断是否被赋值
cmp byte ptr array_evaluated,0
je clear_fail_noEvaluated
;清空数组
mov bx,0
;清空行
mov ch,0
mov cl,array_row
clear_row_loop:
push cx
push ax
push si
;清空列
mov ch,0
mov cl,array_col
clear_col_loop:
push cx
push si
mov ch,0
;元素大于1个存储单元
mov cl,array_element_size
clear_element_loop:
;元素为空
mov byte ptr ds:[bx+si],' '
inc si
loop clear_element_loop
pop si
pop cx
mov al,array_element_size
mov ah,0
add si,ax
loop clear_col_loop
;计算一列占的存储空间大小
mov al,array_element_size
mul byte ptr array_col
add bx,ax
pop si
pop ax
pop cx
loop clear_row_loop
mov byte ptr array_evaluated,0
jmp short clear_end
;数组未被初始化,导致操作失败
clear_fail_noInited:
jmp short clear_end
;数组未被赋值,导致操作失败
clear_fail_noEvaluated:
jmp short clear_end
clear_end:
pop cx
pop bx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;根据给定的元素查找第一个与之匹配的元素
;ax:指定的元素
;dx:元素的下标值
search_element:
push ax
push bx
push cx
;判断是否被初始化
cmp byte ptr array_inited,0
je search_element_fail_noInited
;判断是否被赋值
cmp byte ptr array_evaluated,0
je search_element_fail_noEvaluated
;查找
mov array_temp,ax
mov bx,0
;查找行
mov ch,0
mov cl,array_row
search_element_row_loop:
push cx
push ax
push si
;查找列
mov ch,0
mov cl,array_col
search_element_col_loop:
mov ax,array_temp
cmp ds:[bx+si],ax
je search_element_found
mov al,array_element_size
mov ah,0
add si,ax
loop search_element_col_loop
;计算一列占的存储空间大小
mov al,array_element_size
mul byte ptr array_col
add bx,ax
pop si
pop ax
pop cx
loop search_element_row_loop
jmp short search_element_end
;找到元素
search_element_found:
add bx,si
mov dx,bx
pop si
pop ax
pop cx
jmp short search_element_end
;数组未被初始化,导致操作失败
search_element_fail_noInited:
jmp short search_element_end
;数组未被赋值,导致操作失败
search_element_fail_noEvaluated:
jmp short search_element_end
search_element_end:
pop cx
pop bx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;根据给定的下标查找
;dl:指定行
;dh:指定列
;dx:指定位置的元素
search_cursor:
push ax
push bx
;判断是否被初始化
cmp byte ptr array_inited,0
je search_cursor_fail_noInited
;判断是否被赋值
cmp byte ptr array_evaluated,0
je search_cursor_fail_noEvaluated
;计算下标
mov al,array_col
mul dl
mov ah,array_element_size
mul ah
mov bx,ax
mov al,array_element_size
mul dh
mov si,ax
mov dx,ds:[bx+si]
jmp short search_cursor_end
;数组未被初始化,导致操作失败
search_cursor_fail_noInited:
jmp short search_cursor_end
;数组未被赋值,导致操作失败
search_cursor_fail_noEvaluated:
jmp short search_cursor_end
search_cursor_end:
pop bx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;根据给定的元素更新所有与之匹配的元素
;ax:更新元素
;dx:目标元素
update_element:
push ax
push bx
push cx
push dx
push bp
;判断是否被初始化
cmp byte ptr array_inited,0
je update_element_fail_noInited
;判断是否被赋值
cmp byte ptr array_evaluated,0
je update_element_fail_noEvaluated
;更新
mov array_temp,ax
mov bp,dx
mov bx,0
;查找行
mov ch,0
mov cl,array_row
update_element_row_loop:
push cx
push ax
push si
;查找列
mov ch,0
mov cl,array_col
update_element_col_loop:
mov ax,array_temp
cmp ds:[bx+si],ax
jne goto_update_element
mov ds:[bx+si],bp
goto_update_element:
mov al,array_element_size
mov ah,0
add si,ax
loop update_element_col_loop
;计算一列占的存储空间大小
mov al,array_element_size
mul byte ptr array_col
add bx,ax
pop si
pop ax
pop cx
loop update_element_row_loop
jmp update_element_end
;数组未被初始化,导致操作失败
update_element_fail_noInited:
jmp short update_element_end
;数组未被赋值,导致操作失败
update_element_fail_noEvaluated:
jmp short update_element_end
update_element_end:
pop bp
pop dx
pop cx
pop bx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;根据给定的下标更新元素
;dh:指定行
;dl:指定列
;ax:目标元素
update_cursor:
push ax
push dx
;判断是否被初始化
cmp byte ptr array_inited,0
je update_cursor_fail_noInited
;判断是否被赋值
cmp byte ptr array_evaluated,0
je update_cursor_fail_noEvaluated
mov array_temp,ax
;计算下标
mov al,array_col
mul dl
mov ah,array_element_size
mul ah
mov bx,ax
mov al,array_element_size
mul dh
mov si,ax
mov ax,array_temp
mov ds:[bx+si],ax
jmp short update_cursor_end
;数组未被初始化,导致操作失败
update_cursor_fail_noInited:
jmp short update_cursor_end
;数组未被赋值,导致操作失败
update_cursor_fail_noEvaluated:
jmp short update_cursor_end
update_cursor_end:
pop dx
pop ax
jmp word ptr array_end_address
;*********************************************************************
;统计与指定元素批评的数量
;ax:指定元素
;bp:元素的个数,返回值
statistic_element:
push ax
push bx
push cx
;判断是否被初始化
cmp byte ptr array_inited,0
je statistic_noInited_temp
jmp short statistic_noInited_next
statistic_noInited_temp:
jmp statistic_element_fail_noInited
;判断是否被赋值
statistic_noInited_next:
cmp byte ptr array_evaluated,0
je statistic_noEvaluated_temp
jmp statistic_noEvaluated_next
statistic_noEvaluated_temp:
jmp statistic_element_fail_noEvaluated
statistic_noEvaluated_next:
mov array_temp,ax
mov bx,0
mov bp,0
;查找行
;查找行
mov ch,0
mov cl,array_row
statistic_element_row_loop:
push cx
push ax
push si
;查找列
mov ch,0
mov cl,array_col
statistic_element_col_loop:
mov ax,array_temp
cmp ds:[bx+si],ax
je statistic_element_found
goto_statistic:
mov al,array_element_size
mov ah,0
add si,ax
loop statistic_element_col_loop
;计算一列占的存储空间大小
mov al,array_element_size
mul byte ptr array_col
add bx,ax
pop si
pop ax
pop cx
loop statistic_element_row_loop
jmp short statistic_element_end
statistic_element_found:
inc bp
jmp short goto_statistic
;数组未被初始化,导致操作失败
statistic_element_fail_noInited:
jmp short statistic_element_end
;数组未被赋值,导致操作失败
statistic_element_fail_noEvaluated:
jmp short statistic_element_end
statistic_element_end:
pop cx
pop bx
pop ax
jmp word ptr array_end_address
;*********************************************************************
array_end:
pop bx
pop si
ret
;*****************************************************************************************
code ends
end start
;*****************************************************************************************
[07/09/25] | |
|