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

标签 assembly x86

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

给定的数组是: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”等数字显示而不显示为“=”?

最佳答案

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

您没有意识到大于 9 的值由多个数字组成。这就是为什么值 2 和 4 是正确的;您显示“2nd”和“4th”数字字符,但数字 23 没有字符。您需要将该数字显示为 2 和 3。

您需要的是一个合适的 int 到字符串 函数将值输出为 ascii。

关于assembly - 为什么我的代码显示垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4953506/

相关文章:

c++ - 如何将寄存器的值存储到指针指向的内存位置?

sorting - x86 尝试进行冒泡排序时出现段错误

assembly - 汇编器中的Printf无法打印

assembly - 虚拟机 Ubuntu 上的 NASM : Cannot execute binary file exec format error

c - 从编译器 asm 输出逆向工程数组维度/结构布局?

performance - 省略帧指针真的对性能有积极影响,对调试能力有消极影响吗?

macos - 向 x86-64 二进制文件写入跳转命令

assembly - 如果汇编代码指令等同于机器代码指令,我不明白这些汇编代码和机器代码的差异

assembly - itoa 负数?

delphi - FPU。如何制作一个循环?