📄 5-20.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 + -