在数据段中定义一个变量a2,其中有5个元素(类似于数组),其元素类型为word类型(即每个元素占2个字节,5个元素占10个字节) ,调用5次题目2中的输入子程序分别得到5个整数,依次将它们存放到a2的5个元素中。
offset指令可以获取一个变量距离数据段起始地址的偏移量,如 mov bx,offset a1这条指令可以将a1这个变量距离数据段起始地址的偏移量求出后保存到bx中。
注意: 2中的子程序将处理结果存放在了cpu内部某个寄存器中,而数据段中的变量是在内存中,所以需要把数据从cpu内部的寄存器送往内存中。
每次往a2中存放完一个整数后,指针都要后移两个字节,为下次存储数据做准备。
在数据区定义 a1 和 a2,注意 a2 是数组,然后输入输出即可,每次 si 指针往后走两格,因为一个字符是两个字节。
输入 5 个数到 a2 中,然后输出
DATAS SEGMENT
a1 dw 223
a2 dw ?, ?, ?, ?, ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov dl, 0
mov si, offset a2;
T0: call input
mov [si], ax
add si, 2
add dl, 1
cmp dl, 5
jb T0
mov dl, 0
mov si, offset a2;
T1: mov ax, [si]
call output
add si, 2
inc dl
cmp dl, 5
jb T1
MOV AH,4CH
INT 21H
input proc
push bx
push dx
push cx
mov cl, 10
mov bx, 0
L0: mov ah, 1
int 21h
sub al, 48
cmp al, 0
jb over
cmp al, 9
ja over
mov ah, 0
push ax
mov ax, bx
mul cl
pop bx
add bx, ax
jmp L0
over:
mov ax, bx
pop bx
pop dx
pop cx
ret
input endp
output proc
push dx
; 调用输出
mov ch, 0
mov cl, 10
; 每次循环除以 cl
L0: div cl
; 除以 cl 以后,结果在 al 中,余数在 ah 中
;将余数入栈
push ax
; ch 每次增加,记录位数
inc ch
mov ah, 0
cmp al, 0
ja L0
L1: ; 输出函数
cmp ch, 0
je over2
; 出栈,将栈顶元素存储到 dx 中
pop dx
mov dl, dh
add dl, 48
mov ah, 2
int 21h
dec ch
jmp L1
over2:
pop dx
ret
output endp
CODES ENDS
END START
DATAS SEGMENT
a1 dw ?
a2 dw ?, ?, ?, ?, ?
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov dl, 0
mov si, offset a2;
L1: add dl, 1
mov ah, 1
int 21h
mov [si], ax;
add si, 2
cmp dl, 5
jb L1
mov cl, 0
mov si, offset a2;
L2: add cl, 1
mov dx, [si]
mov ah, 2
int 21h
add si, 2
cmp cl, 5
jb L2;
MOV AH,4CH
INT 21H
CODES ENDS
END START