⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 5-20.asm

📁 用堆栈传递参数的形式把1到100进行累加
💻 ASM
字号:
data    segment
        org 0000
 ary0   dw  $,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$
	dw  $,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$,$
	dw  $,$,$,$,$,$,$,$,$,$
	dw  $
 count0  dw  ($-ary0)/2
 ary    dw 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
        dw 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36
	dw  37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52
	dw  53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68
	dw  69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84
	dw  85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
 count   dw  ($-ary)/2
 sum     dw  ?
 table   dw  3 dup(?)
data    ends

stack_seg   segment para stack 'stack'
        org  0000h
        dw  100h dup(?)
	tos     label word         ;定义TOS的类型为WORD
stack_seg   ends

code    segment
main    proc far
        assume cs:code,ds:data,ss:stack_seg
start:   mov ax,data
   	mov  ds,ax
	mov  ax,stack_seg          ;建立自己的堆栈段
	mov  ss,ax
	mov  sp,offset tos       .
   	mov  bx,offset ary
	push  bx
   	mov  bx,offset count
	push  bx
	mov  bx,offset sum
	push  bx
  	call far  ptr PROADD     
   	mov  di,offset sum        ;取存放和的单元地址
   	call  BIN_dec
   	call  near ptr crlf
   	MOV  AH,4CH
   	INT  21H
main    endp

;入口参数:(bx)=表table首地址,(bx+2)=数组元素个数地址
;         (bx+4)=存放和的单元地址
;出口参数,累加和放入存储单元(bx+4)中返回
proadd  proc  far
   	push  bp
	mov  bp,sp         ;用bp保存堆顶指针
   	push  ax
   	push  cx
	push  si
	push  di
   	mov   bp,sp  
   	mov   si,[bp+10]     ;取数组首地址 
	mov   di,[bp+8]      ;取数组的元素个数地址
	mov   cx,[di]        ;取数组元素个数
	mov   di,[bp+6]      ;取存放和的单元地址
    	xor   ax,ax
next:   add  ax,[si]
        inc  si
        inc  si
        loop  next
        mov  [di],ax
        pop  di
        pop  si
        pop  cx
        pop  ax
	pop  bp
        ret  
proadd  endp

;入口参数:存和单元地址放入di
;出口,用十进制形式显示出来
BIN_dec proc near
        mov  ax,[di]      ;取待转换的和
        mov  cx,10000
        call  divdisp      ;调用除法及显示程序
        mov  ax,dx       ;余数送累加器,为下步再除
        mov  cx,1000
        call  divdisp
        mov  ax,dx
        mov  cx,100
        call  divdisp
        mov  ax,dx
        mov  cx,10
        call  divdisp
        mov  ax,dx
        mov  cx,1
        call  divdisp
        ret
BIN_dec endp

divdisp proc near
        cwd           ;将累加器中的字扩展为双字DX,AX
        div  cx
        push  dx         ;保存余数
        add  al,30h        ;将商的数字转换为ASCII码再显示
        mov  dl,al
        mov  ah,2
        int   21h
        pop  dx           ;恢复余数
        ret
divdisp endp

crlf    proc near
   	mov  dl,13
	mov  ah,2
	int  21h
    	mov  dl,10
	mov  ah,2
	int  21h
	ret
crlf    endp

code    ends
        end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -