Assembly ASM 16位将输入缓冲字符串转换为数字

Assembly ASM 16位将输入缓冲字符串转换为数字,assembly,x86-16,tasm,Assembly,X86 16,Tasm,也许有人能帮我。我正在尝试打印用户输入的尽可能多的“”。所以我需要把字符串转换成数字。我试图在循环中完成它,但有一些问题我的代码不能正常工作它正在打印65535'',基本上这是最大值。也许有人能解释我的问题在哪里 .MODEL small .STACK 200h .DATA input DB 4, ? , 4 dup (?) Symbol DB '*$' .CODE Start: mov AH,0Ah mov ds, ax mov DX, offset input int

也许有人能帮我。我正在尝试打印用户输入的尽可能多的“”。所以我需要把字符串转换成数字。我试图在循环中完成它,但有一些问题我的代码不能正常工作它正在打印65535'',基本上这是最大值。也许有人能解释我的问题在哪里

.MODEL small

.STACK 200h

.DATA

 input DB 4, ? , 4 dup (?)
 Symbol DB '*$'
.CODE

Start: 
  
mov AH,0Ah 
mov ds, ax
mov DX, offset input
int 21h

  mov cl, input[2]
   mov si,2
    mov ax,0

   LoopStart:
   mov bh,10
   mul bh
   mov ah,input[si]
   add ah,al
   sub cl,1
   cmp cl,0
   jne LoopStart

    mov cx,ax
   mov ax, @DATA
   mov ds, ax
    mov dx, offset Symbol
    LoopStart1:
    mov ah, 9 
    int 21h;  
    sub cx,1
    cmp cx,0
    jne LoopStart1



    mov ah, 4Ch
    int 21h

END Start

因此,这里将是有效的解决方案

 .MODEL small
.STACK 200h
.DATA
Symbol DB '*$'
 input DB 6, ? , 6 dup (?)
.CODE
Start: 

   mov ax, @DATA
   mov ds, ax
    mov AH,0Ah
    mov DX, offset input
    int 21h

    mov AH, 0Fh
    int 10h         
    mov AH,0        
    int 10h         

   mov si,2
   mov ax,0
   mov cl,input[1]

LoopStart:
   mov bh,10
   mul bh

   add al,input[si]
   sub al,48
   add si,1
   sub cl,1
   ; cmp cl,0
   
   jne LoopStart

    
  
   mov cx,ax

   
    mov dx, offset Symbol
    LoopStart1:
    mov ah, 9 
    int 21h;  
    sub cx,1
    cmp cx,0
    jne LoopStart1

    mov ah, 0
    int 16h

    mov ah, 4Ch
    int 21h
 
END Start

mul-bh
不执行
AX=AL*bh
。将乘法结果的两半相加是没有意义的。有关工作代码,请参阅(应该很容易移植到16位)我在前面的输入部分遇到了问题。我很确定
mov-ah,0ah;mov-ds,ax
会将您的ds设置为一些奇怪的东西。你真的确定你的输入有效吗?尝试打印回您得到的字符串…@dratenik:或使用调试器执行单步操作,以便检查内存和寄存器。但好的一点是,
mov-ah,0ah
看起来不太可能是正确的细分基础;这不是固定的。(AL在进入EXE时会有一些固定值,IDK什么。除非对代码大小进行超级优化,否则依赖它不是一个好主意。)设置
mov ax,@DATA;中间的MOV DS,AX < /代码>可能是你想要的东西,移动到开始,然后再也不接触DS。如果最大值是66536,为什么输入呼叫只要求4个字符?