帐号 密码  
 
多路树查找-外部查找(B树)【源代码】

多路树查找-外部查找(B树)【下载及演示说明】

双向链表演示程序【下载及演示说明】

循环链表演示程序【下载及演示说明】

链表【讲解】

动态存储分配之边界标识法演示程序【下载及演示说明】

动态存储分配之边界标识法【讲解】

首次适应算法和最佳适应算法【讲解】

动态存储分配之边界标识法【源代码】

振荡排序算法【讲解】

振荡排序演示程序【下载及演示说明】

树和二叉树相互转化【讲解】

深度优先搜索【下载及演示说明】

深度优先搜索【源代码】

朴素字符串匹配演示程序【下载及演示说明】

当前1/4页
首页 上一页 下一页 尾页

算法讲堂

    本栏目所有文章由本站组织业内技术专家原创而成,用汇编语言向学习者讲解经典问题的编程思想和编程方法。

    本栏目所有文章的版权归本站所有,转载请注明出处为汇编网<www.asmedu.net> 。

    现本栏目的内容处于不断添加中,请随时关注。
算法讲堂-》二维数组【源代码】(下载及演示部分会陆续推出)
    ;二维数组
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]

Copyright C 2006-2025 ASMEDU.NET All Rights Reserved
Email: asmedu@163.com