将 DB 变量中的字节值加载到 16 位寄存器中(符号或零扩展字节)

ani*_*ila -1 assembly dos masm dosbox x86-16

我正在使用 MASM 编译器和 DOSBOX。我想将变量的值保存到寄存器中。我想将num1值保存到cx寄存器中。我怎样才能做到这一点?

      .MODEL SMALL
.STACK  50H
.DATA
num1 db '5'
    NL  DB  0DH, 0AH, '$'        
    msg     db ?,0AH,0DH,"Enter an odd number between 0 to 10:$"
     nxtline db 0Ah,0DH,"$"
.CODE
MAIN PROC
    MOV AX, @DATA
    MOV DS, AX
    
    
            
              LEA DX,msg     
              mov ah,9
              int 21H
              LEA DX,nxtline    
              mov ah,9
              int 21H
              
              MOV AH,1                    
              INT 21H 
              LEA DX,nxtline    
              mov ah,9
              int 21H
              
              
              
       mov bl,al   ;save the value from input
              mov num1,bl
               LEA DX,num1     
              mov ah,9
              int 21H
              mov cl,al 
              
   main endp
   end main
Run Code Online (Sandbox Code Playgroud)

Jos*_*uez 5

您将丢失用户在 中输入的值AL。您可以这样输入一个字符:

          MOV AH,1                    
          INT 21H 
Run Code Online (Sandbox Code Playgroud)

该字符存储在 中AL,但在保存该值之前,BL您会显示一个换行符:

          LEA DX,nxtline    
          mov ah,9
          int 21H
Run Code Online (Sandbox Code Playgroud)

并且 in 的值AL消失了,因为该中断用于AL显示字符串。解决方案是在显示换行符BL 之前保存该值:

          MOV AH,1                    
          INT 21H 
   mov bl,al   ;save the value from input
          LEA DX,nxtline    
          mov ah,9
          int 21H
Run Code Online (Sandbox Code Playgroud)

编辑:将值移至CX

xor cx,cx       ;CLEAR CX.
mov cl,bl       ;MOVE CHAR INTO CL.
sub cl, 48      ;CONVERT CHAR TO DIGIT, EXAMPLE: '5' -> 5.
Run Code Online (Sandbox Code Playgroud)