汇编语言 写一个子程序,实现把DATA1段中的数累加到DATA2段中的相应数。再写一个子程序实现将DATA2中的十进制数输出到屏幕
题目:
写一个子程序,实现把DATA1段中的数累加到DATA2段中的相应数。再写一个子程序实现将DATA2中的十进制数输出到屏幕
DATA1 SEGMENT
dw 55,34,1,8,3,38
DATA1 ENDS
DATA2 SEGMENT
dw 34,23,5,7,83,18
DATA2 ENDS
方案一:
DATA1 SEGMENT
dw 55,34,1,8,3,38
DATA1 ENDS
DATA2 SEGMENT
dw 34,23,5,7,83,18
DATA2 ENDS
STACKS SEGMENT
db 40 dup(0)
STACKS ENDS
CODES SEGMENT
START:
MOV AX,DATA1
MOV DS,AX
mov ax,DATA2
mov es,ax
mov ax,STACKS
mov ss,ax
mov sp,40
mov bx,0
mov cx,6
mov si,0
call adda2b
mov cx,6
mov si,0
s3:
call convert
add si,2
mov dl,10
mov ah,02
int 21h
loop s3
MOV AH,4CH
INT 21H
;功能:把十进制数转换成ascII码
;参数:si存放要转换的十进制数的地址
convert:
push ax
push bx
push cx
push dx ;保存子程序开始之前的寄存器的值
mov dx,0
push dx ;先存入一个0到栈,在出栈显示时,如果出栈的数字是0说明数字显示完成
mov ax,[si] ;读取十进制
s: mov bl,10
div bl ;把十进制数除以10,商数存放在al,余数在ah中
mov cl,al ;把商数保存到cl中
mov ch,0
mov dl,ah
add dl,30h
mov dh,0
push dx ;把分离出来的字符先保存到栈
mov ax,cx
inc cx ;loop指令先把cx减1,再判断cx是否为0
loop s
s1:
pop dx
mov cx,dx
jcxz ok
mov ah,02
int 21h
loop s1
ok:
pop dx ;恢复寄存器的值
pop cx
pop bx
pop ax
ret
adda2b:
mov ax,[bx]
add ax,es:[si]
mov [si],ax
add bx,2
add si,2
loop adda2b
ret
CODES ENDS
END START
方案二:
DATA1 SEGMENT
str1 dw 55,34,1,8,3,38
DATA1 ENDS
DATA2 SEGMENT
str2 dw 34,23,5,7,83,18
DATA2 ENDS
STACKS SEGMENT
db 40 dup(0)
STACKS ENDS
CODES SEGMENT
START:
mov ax,DATA2
mov ds,ax
mov ax,DATA1
mov es,ax
mov ax,stacks
mov ss,ax
mov sp,40
mov di,offset str1
mov bx,offset str2
mov cx,6
call convert1
mov cx,6
mov si,0
s3: call convert2
add si,2
mov dl,10
mov ah,02
int 21h
loop s3
MOV AH,4CH
INT 21H
convert1:
s:
mov dx,es:[di]
add dx,[bx]
mov [bx],dx
add bx,2
add di,2
loop s
ret
convert2:
push ax
push bx
push cx
push dx
mov dx,0
push dx
mov ax,[si]
s1: mov bl,10
div bl
mov cl,al
mov ch,0
mov dl,ah
add dl,30h
mov dh,0
push dx
mov ax,cx
inc cx
loop s1
s2: pop dx
mov cx,dx
jcxz ok
mov ah,02
int 21h
loop s2
ok: pop dx
pop cx
pop bx
pop ax
ret
CODES ENDS
END START