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

时间:2019-04-20 18:34:34

标签: assembly x86-16 microprocessors

我必须将16位作为1234输入,并试图显示它。但是它的输出为4660。我试图逐位存储数字,因为当我接受输入时,它将以ASCII形式存储在al中。之后,我尝试使用shift left(al)操作将SHL中的整个位向左移,如果我插入了1,这将在al中给我10。之后,我插入了第二个并执行移位和旋转操作,如果存储的第二个数字为2,我试图使其以02的形式显示。此外,我对存储在寄存器中的10和02执行了OR操作。我重复了相同的过程来存储较低的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

1 个答案:

答案 0 :(得分:3)

将ASCII数字转换为整数后,您将4位半字节打包到BCD (Bindary Coded Decimal)中,而不是乘以十进制的位值(10的幂)以形成二进制整数。

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

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

NASM Assembly convert input to integer?表示字符串->使用标准的二进制整数
total = total*10 + digit算法,从最高有效位开始。

该问与答具有32位代码,但是一旦您理解该算法,它就很容易实现。或者,您也可以使用16位代码在堆栈溢出时搜索其他问答(例如,如果内置搜索无济于事,请使用google)。