Assembly 如何将输入的数字保存为位而不是字节?

Assembly 如何将输入的数字保存为位而不是字节?,assembly,x86,binary,real-time,tasm,Assembly,X86,Binary,Real Time,Tasm,正如标题所说,我试图将一个数字保存为二进制,但当我从输入中读取它时,它将其作为一个完整的字节 我正在使用一个声明为var dd的变量?我试图从输入中读取一个32位二进制数,并在变量的每个字节中保存8位。我的问题是,当我保存变量时,它将1或0作为一个完整字节,而不是一个位,因此它实际上只保存前四个数字 我使用的是TASM和32位寄存器 .model small .386 .stack .data var dd ? .code main PROC mov ax,@data

正如标题所说,我试图将一个数字保存为二进制,但当我从输入中读取它时,它将其作为一个完整的字节

我正在使用一个声明为var dd的变量?我试图从输入中读取一个32位二进制数,并在变量的每个字节中保存8位。我的问题是,当我保存变量时,它将1或0作为一个完整字节,而不是一个位,因此它实际上只保存前四个数字

我使用的是TASM和32位寄存器

.model small 
.386
.stack 
.data
    var dd ? 
.code  
main PROC
    mov ax,@data 
    mov ds, ax 
    mov si, 0 

    .inp1A:
        cmp si, 32 
        je .ext4
        mov ah, 00h 
        int 16h 
        jmp .modi1A

   .modi1A:
        mov OFFSET numeroA[si], al 
        mov ah, 0Eh 
        mov al, OFFSET numeroA[si] 
        mov bh, 00h 
        int 10h 
        inc si
        jmp .inp1A
    .ext4:
       .exit
main ENDP 

这就是我试图保存数字的方式,但实际上是将每个数字保存为字节而不是位。我还应该使用中断16h来获取输入。现代计算机最多只能进行字节寻址。因此,您可以加载的最小数据量是一个字节。这就是为什么0和1被认为是0000和0000 0001。如果要访问字节内的位,需要加载整个字节,并使用and、OR、NOT等逐位逻辑来进行所需的更改

比如说,, 您需要值的第5位(字节)才能更改为0。 你必须做到:

  mov al, byte [memory_address_of_the_value]
  and al, 00010000b ;or you can give 0x10/16
  mov byte [memory_address_of_the_value], al

我不清楚你到底想做什么。您的意思是要从键盘读取32个
'0'
'1'
字符,并将其转换为32位值吗?如果是这样的话,
sub
shl
就可以了。好吧,我试试寻址,我只是不知道怎么用。是的,这就是我想要的,每0和1代表一个位,而不是一个字节。如果你不熟悉,你应该花一些时间来学习它,因为它是汇编代码中非常常见的一类操作。