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

问题描述 投票:2回答:1

我必须将16位作为输入作为1234并尝试显示它。但它输出为4660.我试图逐位存储,因为当我接受输入时,它将以ASCII格式存储在al中。在那之后我尝试将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
assembly x86-16 microprocessors
1个回答
3
投票

将ASCII数字转换为整数后,将4位半字节组合成BCD (Bindary Coded Decimal),而不是乘以小数位值(10的幂)来生成二进制整数。

4660(十进制)= 0x1234所以你确实正确地实现了你的BCD打包,但这不是你想要做的第一件事。

左移4相当于乘以16而不是10。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.