實訓組合語言設計——刪除陣列中所有為零的項
阿新 • • 發佈:2019-01-22
;程式實現的功能如下:
;100字陣列的地址為mem,編寫的程式刪除陣列中所有為零的項,
;並將後續向前壓縮,最後將陣列的剩餘部分補零。
data segment
mem dw 20 dup(0,1, 2, 3, 4)
n equ $-data
data ends
stack segment
stapn dw 50 dup(?)
stack ends
code segment
main proc far
assume ds:data,cs:code,ss:stack
start:
;set up stack to retuan
push ds
sub ax,ax
push ax
;set DS register to current segment
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
;maim part of the code goes here
mov cx,100
lea di,mem
mov sp,di
add sp,n ;獲取陣列的最後字單元的地址加2
push cx
push di
add di,n
again:mov dx,0 ;此部分迴圈完成陣列men後的100個字的內容
mov [di],dx ;全部補零,以便在後續的程式只須刪除零項
add di,2 ;而不必在陣列最後部分補零
loop again
pop di
pop cx ;記錄外迴圈次數
loop1:test [di],0ffffh
jnz continue
mov si,di ;記錄0項的ea
next:mov ax,[si+2] ;實現向前壓縮
mov [si],ax
add si,2
cmp si,sp
jae continue
jmp next
continue:add di,2
loop loop1
exit:ret
main endp
;--------------------------------------------------
code ends
;************************************************
end start
;100字陣列的地址為mem,編寫的程式刪除陣列中所有為零的項,
;並將後續向前壓縮,最後將陣列的剩餘部分補零。
data segment
mem dw 20 dup(0,1, 2, 3, 4)
n equ $-data
data ends
stack segment
stapn dw 50 dup(?)
stack ends
code segment
main proc far
assume ds:data,cs:code,ss:stack
start:
;set up stack to retuan
push ds
sub ax,ax
push ax
;set DS register to current segment
mov ax,data
mov ds,ax
mov es,ax
mov ax,stack
mov ss,ax
;maim part of the code goes here
mov cx,100
lea di,mem
mov sp,di
add sp,n ;獲取陣列的最後字單元的地址加2
push cx
push di
add di,n
again:mov dx,0 ;此部分迴圈完成陣列men後的100個字的內容
mov [di],dx ;全部補零,以便在後續的程式只須刪除零項
add di,2 ;而不必在陣列最後部分補零
loop again
pop di
pop cx ;記錄外迴圈次數
loop1:test [di],0ffffh
jnz continue
mov si,di ;記錄0項的ea
next:mov ax,[si+2] ;實現向前壓縮
mov [si],ax
add si,2
cmp si,sp
jae continue
jmp next
continue:add di,2
loop loop1
exit:ret
main endp
;--------------------------------------------------
code ends
;************************************************
end start