当前位置:编程学习 > 汇编语言 >>

麻烦各位会汇编语言的大侠帮忙看一下下面一个简单的汇编程序出错在哪里。。。在线等。。。

;下面的代码是输入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中。

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,