Assembly 如何将输入的数字保存为位而不是字节?
正如标题所说,我试图将一个数字保存为二进制,但当我从输入中读取它时,它将其作为一个完整的字节 我正在使用一个声明为var dd的变量?我试图从输入中读取一个32位二进制数,并在变量的每个字节中保存8位。我的问题是,当我保存变量时,它将1或0作为一个完整字节,而不是一个位,因此它实际上只保存前四个数字 我使用的是TASM和32位寄存器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
.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代表一个位,而不是一个字节。如果你不熟悉,你应该花一些时间来学习它,因为它是汇编代码中非常常见的一类操作。