为什么我的代码会显示垃圾?

时间:2011-02-10 04:51:16

标签: assembly x86

当我想打印列表中的每个数字时,我的代码显示垃圾,有什么不对吗?输出应如下所示:

GIVEN ARRAY是:2G; 4?PT 为什么这个垃圾
总数是:7

代码

ASSUME  CS:CODE , DS : DATA, SS: STK
ORG 0000H

DATA SEGMENT
  LIST DB 2,23,11,4,15,32,"$"    ; Given Array with last element $ to indicate end 
MESSAGE1    db "THE GIVEN ARRAY IS:$"   ;message 1  
MESSAGE2    db "THE TOTAL NUMBER IS:$"  ;message 2  
DATA ENDS

;stack segment  
STK SEGMENT STACK  
DB  512 DUP (?)  
TOS LABEL   WORD  
STK ENDS  

; code segment  
CODE SEGMENT    
    ORG 2000H

START :  
MOV DX, DATA  
MOV DS, DX  
MOV DX, STK  
MOV SS, DX  
MOV SP, OFFSET TOS  
XOR AX, AX                  ; Clear register  
XOR BX, BX                  ; Initialise index register  

LEA DX, MESSAGE1  
MOV AH, 9h
INT 21H

LEA SI , list

MOV CL,0  
MOV AL,"$"   

AGAIN:   
CMP AL,[SI]  ; look for end of list  
JE over  
MOV DL, LIST[BX]                ; Move array numbers      
ADD DX, 30H      ; convert number to character.  
MOV AH, 2                   ;display the number at the screen  
INT 21H  

INC SI  
INC BX
INC CL
Jmp AGAIN       

over:    
LEA DX, MESSAGE2  
MOV AH, 9h  
INT 21H  

PUSH CX           ; transfer cl to dl for int21/ah=2.  
POP DX  
ADD DX, 30H      ; convert number to character.  
MOV AH, 02H      ; prints the character in dl.  
INT 21H  
MOV AH, 4CH      ; exit.  
INT 21H  

CODE ENDS    
END START  

我想我知道为什么不管大于10的数字会显示为字符,但如何让它显示为“13”这样的数字不显示为“=”?

1 个答案:

答案 0 :(得分:6)

LIST DB 2,23,11,4,15,32,"$"

您没有意识到超过9的值包含多个数字。这就是值2和4出现正确的原因;显示“2nd”和“4th”数字字符,但23号没有字符。您需要将该数字显示为2 3。

您需要的是一个正确的 int to string 函数,以将值输出为ascii。