Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何将用户输入的整数保存到寄存器_Assembly_X86_Nasm - Fatal编程技术网

Assembly 如何将用户输入的整数保存到寄存器

Assembly 如何将用户输入的整数保存到寄存器,assembly,x86,nasm,Assembly,X86,Nasm,我不确定如何将用户输入数据实际存储到寄存器中。我想提示用户输入一个带符号的10进制整数,然后将该整数存储到bx寄存器中。我所拥有的似乎并没有实际存储我所知道的任何数据: ;get user input mov ah, 0Ah int 21h while: mov bx, ax ;save char to bx cmp ax, 13 ;is char = carriage return? jmp endwhi

我不确定如何将用户输入数据实际存储到寄存器中。我想提示用户输入一个带符号的10进制整数,然后将该整数存储到
bx
寄存器中。我所拥有的似乎并没有实际存储我所知道的任何数据:

;get user input

   mov   ah, 0Ah
   int   21h


while:
    mov   bx, ax        ;save char to bx
    cmp   ax, 13        ;is char = carriage return?
    jmp   endwhile      ;if so, we're done
    int   21h           ;get another char
    loop  while
endwhile:
    ret                 ;end loop

;print data stored in bx to console

    mov   ah, 09
    mov   dx, [bx]
    int   21h

有什么特别突出的地方表明我做错了吗?

按照您构建代码的方式,您希望使用01中断,它读取并返回一个字符,而不是0A,它将行读入您给定的缓冲区

mov bx,ax
将覆盖
bx
中的值,因此如果有119,则只存储9。相反,你应该将bx乘以10,然后在al处加上值

jmp endwhile
将无条件跳转到endwhile,因此您应该使用
je endwhile
,它仅在值相等时才会跳转。 此外,在尝试累积al到bx的结果之前,您应该这样做,否则,您将在读取的编号中包含回车符。最后,请记住,所有读入的数字很可能都是ASCII码,因此字符“0”将是48,“1”将是49,等等。因此,在将它们用作整数之前,您必须对48进行细分

mov-dx,[bx]
将在ds:bx指向的地址加载数据,在本例中,该地址没有意义。相反,您必须分配一个内存区域,将数字转换回字符串,然后给出该区域的地址。这大概和读取数字的工作量一样多


总的来说,为了达到你的目的,需要进行大量的重写。除非出于学习目的,否则我将坚持使用标准c库方法进行I/o,并使用64位x86而不是16位。

按照您构建代码的方式,您希望使用01中断,它读取并返回一个字符,而不是0A,它将行读取到您给定的缓冲区中

mov bx,ax
将覆盖
bx
中的值,因此如果有119,则只存储9。相反,你应该将bx乘以10,然后在al处加上值

jmp endwhile
将无条件跳转到endwhile,因此您应该使用
je endwhile
,它仅在值相等时才会跳转。 此外,在尝试累积al到bx的结果之前,您应该这样做,否则,您将在读取的编号中包含回车符。最后,请记住,所有读入的数字很可能都是ASCII码,因此字符“0”将是48,“1”将是49,等等。因此,在将它们用作整数之前,您必须对48进行细分

mov-dx,[bx]
将在ds:bx指向的地址加载数据,在本例中,该地址没有意义。相反,您必须分配一个内存区域,将数字转换回字符串,然后给出该区域的地址。这大概和读取数字的工作量一样多


总的来说,为了达到你的目的,需要进行大量的重写。除非出于学习目的,否则我将坚持使用标准c库方法进行I/o,并使用64位x86而不是16位。

按照您构建代码的方式,您希望使用01中断,它读取并返回一个字符,而不是0A,它将行读取到您给定的缓冲区中

mov bx,ax
将覆盖
bx
中的值,因此如果有119,则只存储9。相反,你应该将bx乘以10,然后在al处加上值

jmp endwhile
将无条件跳转到endwhile,因此您应该使用
je endwhile
,它仅在值相等时才会跳转。 此外,在尝试累积al到bx的结果之前,您应该这样做,否则,您将在读取的编号中包含回车符。最后,请记住,所有读入的数字很可能都是ASCII码,因此字符“0”将是48,“1”将是49,等等。因此,在将它们用作整数之前,您必须对48进行细分

mov-dx,[bx]
将在ds:bx指向的地址加载数据,在本例中,该地址没有意义。相反,您必须分配一个内存区域,将数字转换回字符串,然后给出该区域的地址。这大概和读取数字的工作量一样多


总的来说,为了达到你的目的,需要进行大量的重写。除非出于学习目的,否则我将坚持使用标准c库方法进行I/o,并使用64位x86而不是16位。

按照您构建代码的方式,您希望使用01中断,它读取并返回一个字符,而不是0A,它将行读取到您给定的缓冲区中

mov bx,ax
将覆盖
bx
中的值,因此如果有119,则只存储9。相反,你应该将bx乘以10,然后在al处加上值

jmp endwhile
将无条件跳转到endwhile,因此您应该使用
je endwhile
,它仅在值相等时才会跳转。 此外,在尝试累积al到bx的结果之前,您应该这样做,否则,您将在读取的编号中包含回车符。最后,请记住,所有读入的数字很可能都是ASCII码,因此字符“0”将是48,“1”将是49,等等。因此,在将它们用作整数之前,您必须对48进行细分

mov-dx,[bx]
将在ds:bx指向的地址加载数据,在本例中,该地址没有意义。相反,您必须分配一个内存区域,将数字转换回字符串,然后giv
.stack 100h
;------------------------------------------
.data
;------------------------------------------
msj1   db 'Enter a number: $'
string db 5 ;MAX NUMBER OF CHARACTERS ALLOWED (4).
       db ? ;NUMBER OF CHARACTERS ENTERED BY USER.
       db 5 dup (?) ;CHARACTERS ENTERED BY USER. 
msj2   db 13,10,'Number has been converted',13,10,13,10,'$'
;------------------------------------------
.code          
;INITIALIZE DATA SEGMENT.
  mov  ax, @data
  mov  ds, ax
;------------------------------------------        
;DISPLAY MESSAGE.
  mov  ah, 9
  mov  dx, offset msj1
  int  21h
;------------------------------------------
;CAPTURE CHARACTERS (THE NUMBER).
  mov  ah, 0Ah
  mov  dx, offset string
  int  21h
;------------------------------------------
  call string2number
;------------------------------------------        
;DISPLAY MESSAGE.
  mov  ah, 9
  mov  dx, offset msj2
  int  21h
;------------------------------------------
;STOP UNTIL USER PRESS ANY KEY.
  mov  ah,7
  int  21h
;------------------------------------------
;FINISH THE PROGRAM PROPERLY.
  mov  ax, 4c00h
  int  21h           
;------------------------------------------
;CONVERT STRING TO NUMBER IN BX.
proc string2number         
;MAKE SI TO POINT TO THE LEAST SIGNIFICANT DIGIT.
  mov  si, offset string + 1 ;NUMBER OF CHARACTERS ENTERED.
  mov  cl, [ si ] ;NUMBER OF CHARACTERS ENTERED.                                         
  mov  ch, 0 ;CLEAR CH, NOW CX==CL.
  add  si, cx ;NOW SI POINTS TO LEAST SIGNIFICANT DIGIT.
;CONVERT STRING.
  mov  bx, 0
  mov  bp, 1 ;MULTIPLE OF 10 TO MULTIPLY EVERY DIGIT.
repeat:         
;CONVERT CHARACTER.                    
  mov  al, [ si ] ;CHARACTER TO PROCESS.
  sub  al, 48 ;CONVERT ASCII CHARACTER TO DIGIT.
  mov  ah, 0 ;CLEAR AH, NOW AX==AL.
  mul  bp ;AX*BP = DX:AX.
  add  bx,ax ;ADD RESULT TO BX. 
;INCREASE MULTIPLE OF 10 (1, 10, 100...).
  mov  ax, bp
  mov  bp, 10
  mul  bp ;AX*10 = DX:AX.
  mov  bp, ax ;NEW MULTIPLE OF 10.  
;CHECK IF WE HAVE FINISHED.
  dec  si ;NEXT DIGIT TO PROCESS.
  loop repeat ;COUNTER CX-1, IF NOT ZERO, REPEAT.
  ret 
endp