Assembly 以16位数字作为输入并显示在屏幕上

Assembly 以16位数字作为输入并显示在屏幕上,assembly,x86-16,microprocessors,Assembly,X86 16,Microprocessors,我必须将16位作为输入作为1234并尝试显示它。但它的输出为4660。我试图逐位存储,因为当我接受输入时,它将以ASCII格式存储在al中。之后,我尝试使用shift left(SHL)操作将al中的整个位向左移位,如果我插入了1,将得到10 inal。在插入第二个数字并执行移位和旋转操作之后,如果存储的第二个数字是2,我尝试将其设置为02形式。此外,我对存储在寄存器中的10和02执行了或操作。我重复了同样的过程来存储较低的8位数字。但结果是不同的 .model small .stack 100

我必须将16位作为输入作为1234并尝试显示它。但它的输出为4660。我试图逐位存储,因为当我接受输入时,它将以ASCII格式存储在
al
中。之后,我尝试使用shift left(
SHL
)操作将
al
中的整个位向左移位,如果我插入了1,将得到10 in
al
。在插入第二个数字并执行移位和旋转操作之后,如果存储的第二个数字是2,我尝试将其设置为02形式。此外,我对存储在寄存器中的10和02执行了
操作。我重复了同样的过程来存储较低的8位数字。但结果是不同的

.model small
.stack 100h
.data

.code
    main proc
    mov ax,@data
    mov ds,ax

    ;taking 16 bit number input
    mov ah,01h
    int 21h
    mov bh,al
    mov cl,4
    shl bh,cl

    mov ah,01h
    int 21h
    mov cl,4
    shl al,cl
    mov cl,4
    ror al,cl
    or bh,al

    mov ah,01h
    int 21h
    mov bl,al
    mov cl,4
    shl bl,cl

    mov ah,01h
    int 21h
    mov cl,4
    shl al,cl
    mov cl,4
    ror al,cl
    or  bl,al
    ;taking 16 bit number input


    ;displaying number in dos
    mov     ax,bx
mov     bx,10         
    xor     cx,cx          
  .a: 
    xor     dx,dx          
    div     bx             
    push    dx             
    inc     cx             
    test    ax,ax          
    jnz     .a             
 .b: 
    pop     dx             
    add     dl,"0"         
    mov     ah,02h         
    int     21h            
    loop    .b
exit:
   mov ah,4ch
   int 21h
   main endp
   end main

将ASCII数字转换为整数后,您将4位半字节打包为整数,而不是乘以小数位数(10的幂)来生成二进制整数

4660(十进制)=0x1234因此您确实正确地实现了BCD打包,但这不是您首先要做的

左移4等于乘以16,而不是10

对于字符串->使用标准的二进制整数
total=total*10+位
算法
,从最高有效位开始


Q&A有32位代码,但一旦你理解了算法,它本身就很容易实现。或者,您可以使用16位代码搜索堆栈溢出上的其他Q&A(例如,如果内置搜索没有帮助,则使用google)。

您使用shl/ror做什么?这看起来相当于
和al,0Fh
将高位的4位归零,相当于更常见的
sub-al,'0'
将ASCII数字转换为整数。看看这个Q/a处理了完全相同的问题并解决了它。“1234”是否存储在寄存器bx中?@Natalie:不,16进制的1234是10进制的4660。十进制1234(您想要的)的十六进制位模式是
0x04d2
。好的,我知道了。非常感谢你。