麻烦各位会汇编语言的大侠帮忙看一下下面一个简单的汇编程序出错在哪里。。。在线等。。。
;下面的代码是输入15个数字,然后原样输出的简单汇编程序
;编译和连接都没有错啊,为啥不能输出15个数字呢???
data segment
ts1 db 'Please input the 15 numbers:',0ah,0dh,'$'
str1 db 15 dup(0),0ah,0dh,'$'
ts2 db 0ah,0dh,'The exchanged 15 numbers is :',0ah,0dh,'$'
data ends
code segment
assume cs:code,ds:data,es:data
start:
mov ax,data
mov ds,ax
mov es,ax
lea dx,ts1
mov ah,09h
int 21h
mov cx,15
mov si,1
lop1: mov ah,01h
int 21h
mov str1[si],al
inc si
call kg ;过程调用,输出空格
loop lop1
lea dx,ts2
mov ah,09h
int 21h ;输出提示信息
mov cx,15
mov si,1
lop2: mov al,str1[si] ;原样输出15个数字,结果无法输出!!!原因在哪呢?
mov dl,al
mov ah,02h
call kg ;过程调用,输出空格
int 21h
inc si
loop lop2
mov ah,4ch
int 21h
kg proc near
mov dl,' '
mov ah,02h
int 21h
ret
kg endp
code ends
end start
答案:;修改完毕,已测试
DATA SEGMENT
TS1 DB 'PLEASE INPUT THE 15 NUMBERS:',0AH,0DH,'$'
STR1 DB 15 DUP(0),0AH,0DH,'$'
TS2 DB 0AH,0DH,'THE EXCHANGED 15 NUMBERS IS :',0AH,0DH,'$'
DATA ENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS ;****缺少堆栈段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK ;****缺少堆栈段
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA DX,TS1
MOV AH,09H
INT 21H
MOV CX,15
MOV SI,0 ;****注意从0开始
LOP1: MOV AH,01H
INT 21H
MOV STR1[SI],AL
INC SI
CALL KG
LOOP LOP1
LEA DX,TS2
MOV AH,09H
INT 21H
MOV CX,15
MOV SI,0 ;****注意从0开始
LOP2: MOV AL,STR1[SI]
MOV DL,AL
MOV AH,02H
INT 21H ;****注意这两条指令不要分开
CALL KG
INC SI
LOOP LOP2
MOV AH,4CH
INT 21H
KG PROC NEAR
MOV DL,' '
MOV AH,02H
INT 21H
RET
KG ENDP
CODE ENDS
END START
其他:在第二个Call kg前加一条int 21h 我来一针见血的指出来吧。。第一si必须从0开始,第二,你知道为啥输不出来不?因为你调用子程序时,没有保护现场,导致你调用子程序后dl的值发生变化,所以输不出来,应该全是空格才对,是不?建议使用堆栈段,可以开头不用描述,直接使用系统的即可。。写到这你应该能看懂了,详细的话我回宿舍再打出来详细的程序,现在我在自习室里。。
data segment
ts1 db 'Please input the 15 numbers:',0ah,0dh,'$'
str1 db 15 dup(0),0ah,0dh,'$'
ts2 db 0ah,0dh,'The exchanged 15 numbers is :',0ah,0dh,'$'
data ends
code segment
assume cs:code,ds:data,es:data
start:
mov ax,data
mov ds,ax
mov es,ax
lea dx,ts1
mov ah,09h
int 21h
mov cx,15
mov si,0
lop1: mov ah,01h
int 21h
mov str1[si],al
inc si
call kg ;过程调用,输出空格
loop lop1
lea dx,ts2
mov ah,09h
int 21h ;输出提示信息
mov cx,15
mov si,0
lop2: mov al,str1[si] ;原样输出15个数字,结果无法输出!!!原因在哪呢?
mov dl,al
mov ah,02h
call kg ;过程调用,输出空格
int 21h
inc si
loop lop2
mov ah,4ch
int 21h
kg proc near
PUSH DX
PUSH AX
mov dl,' '
mov ah,02h
int 21h
POP AX
POP DX
ret
kg endp
code ends
end start
改的地方用大写显示,自己对照
上一个:计算机汇编语言问题
下一个:单片机汇编语言编程 将外部数据存储器2000H至2010H中的最大的数和最小的数存入10H、11H中。