assembly - 转换十六进制/十进制数 (Assembly-TASM)

标签 assembly x86 tasm

我试图简单地按顺序打印数字,即

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

使用循环, 首先,我将每个数字转换为十六进制打印,将其重置为十进制增量 1,然后打印下一个,直到数字等于 9, 当数字等于 9 时,我使用 DAA 来简化数字,在旋转和移位数字后,我最终将结果存储在字符串中。

输出在 16 之前都很好,但在 16 之后序列会重复本身,

所需输出:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

电流输出 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,11,12,13,14,15

为什么会这样???

这是我的代码,

MOV CX,20 ;Number of Iterations


MOV DX,1



L1:
    PUSH DX
    ADD DX,30H  
    MOV AH,02H        ;PRINT Content of DX
    INT 21H
    POP DX
    ADD DX,1
    CMP DX,09d        ;If number is Greater than 9 jump to L2   
    JA L2
LOOP L1


    L2: 
        PUSH DX
        MOV AX,DX
        DAA           ;Convert to the Decimal
        XOR AH,AH         ;SET AH to 0000


        ROR AX,1    
        ROR AX,1    
        ROR AX,1    
        ROR AX,1    

        SHR AH,1
        SHR AH,1
        SHR AH,1
        SHR AH,1

        ADC AX,3030h
        MOV BX,OFFSET Result
        MOV byte ptr[BX],5           ; Length of the String
        MOV byte ptr[BX+4],'$'       ;5th position of string , $=Terminator
        MOV byte ptr[BX+3],AH        ;2nd Number onto 4th position
        MOV byte ptr[BX+2],AL        ;3rd number onto 3rd Position 

        MOV DX,BX
        ADD DX,02     ;1st 2 positions of String are type of string and    
                                  length respectively 
        MOV AH,09H ;to print the string
        INT 21H         

        POP DX      
        ADD DX,1

    LOOP L2

MOV AH,4CH  ;Return control to the DOS
INT 21H

P.S:我从这张图表中获得了帮助来理解这些数字。

http://www.cheat-sheets.org/saved-copy/ascii.png

最佳答案

8086 代码仅允许使用立即数 1(或 cl)来计数移位和循环。要启用 286 代码,请在文件顶部告诉 Tasm“.286”。这是一个猜测。

我记得我曾经在 al 中打印两位数的方式:

aam
add ax, 3030h
xchg al, ah
int 29h
mov al, ah
int 29h

关于assembly - 转换十六进制/十进制数 (Assembly-TASM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12536640/

相关文章:

c - 一个简单的 "Hello World"C/C++ 内联汇编语言程序

memory-management - x86 的物理内存地址到 DRAM 映射信息

assembly - 如何将变量转换为 DECIMAL 字符串以进行打印?

linux - 当我在 system_read 中断、程序集方面按下 Enter 按钮时究竟发生了什么?

c++ - C++ 和汇编程序之间的 Scanf 函数

math - Z80 上的溢出和进位标志

c - 了解简单 C 程序的汇编

c - 如何使用缓存线原子性在 CPU 之间复制多个数据元素?

assembly - 我不明白如何使用Interrupt 21,AH = 0ah

windows - Tasm 对名称较长的文件给出错误