Assembly 将0x80000000添加到注册赢得的';当试图建立一个面具时,它不起作用
给定以下代码:Assembly 将0x80000000添加到注册赢得的';当试图建立一个面具时,它不起作用,assembly,masking,Assembly,Masking,给定以下代码: .section .rodata input_format: .string "%d" output_format1: .string "" output_format2: .string "" .section .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp .loop: addl $-4 ,%esp
.section .rodata
input_format: .string "%d"
output_format1: .string ""
output_format2: .string ""
.section .text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
.loop:
addl $-4 ,%esp # moving down the stack
pushl %esp
pushl $input_format
call scanf # call scanf to get a number from the user
addl $8,%esp
movl (%esp),%edx # get the new number
movl $0,%esi # reseting first mask
addl $0x1,%esi # first mask of 0x1
movl $0,%ecx # reseting second mask
addl $0x80000000,%ecx
// more code in the future
# return from printf:
movl %ebp,%esp
popl %ebp
ret
我试图建立一个面具,以确定一个给定的数字是否是回文。
因此,我需要屏蔽,首先是所有的零和MSB中的一个“1”位,然后是另一个
使用LSB中的所有零和“1”位,然后运行16次,并使用和比较结果。
但是,当写入
addl$0x8000000,%ecx
时,寄存器%ecx
不会立即获得0x8000000
。为什么会这样?什么是0x8000000+0x8000000?这就是为什么它似乎不起作用的原因
要设置高位,请使用位操作
orl $0x80000000, %ecx
0x80000000+0x80000000是什么?这就是为什么它似乎不起作用的原因 要设置高位,请使用位操作
orl $0x80000000, %ecx
经过进一步思考,我认为我需要编写addl$0x8000,%ecx。我说得对吗?取决于哪个位是标志位。我有32位,所以我需要LSB(最左边的)为“1”,然后每次迭代都将其右移。是的,我非常确定没有x86操作码可以在一步中生成完整的4字节文字值。不过,有人会认为汇编程序会抱怨。什么是“完整的4字节文字值”?经过进一步思考,我认为我需要编写addl$0x8000,%ecx。我说得对吗?取决于哪个位是标志位。我有32位,所以我需要LSB(最左边的)为“1”,然后每次迭代都将其右移。是的,我非常确定没有x86操作码可以在一步中生成完整的4字节文字值。不过,有人会认为汇编程序会抱怨。什么是“完整的4字节文字值”?仍然不起作用,你写的那行后面的'ecx'值是:-2147483648。@ron---2147483648是0x8000000。是的,我在写了那条评论一分钟后得到了这个值。因此,我想现在对每两位进行AND和ing并比较结果不会有任何问题。那么,为什么这会起作用,而0->ecx,将0x8000000添加到ecx不起作用?仍然不起作用,您写的行后面的“ecx”的值是:-2147483648。@ron--2147483648是0x8000000。是的,我在写了那个注释后一分钟就得到了。因此,我想现在对每两个位进行AND和ing并比较结果不会有任何问题。那么,为什么这会起作用而0->ecx,将0x8000000添加到ecx不起作用呢?