Assembly 无法在32位代码中递增寄存器

Assembly 无法在32位代码中递增寄存器,assembly,x86,nasm,increment,intel,Assembly,X86,Nasm,Increment,Intel,我有一个相当愚蠢的问题,但我在任何地方都找不到解决办法 我正试图编写一个程序,将内存中的两个数字逐段(32位)相加(带进位),并将部分和写入堆栈。不幸的是,不知道为什么,循环计数器在inc%ecx之后没有增加。(我在gdb中进行了测试,%ecx即使在inc指令之后仍然保持在0) 我是为英特尔体系结构编写的,但是使用AT&T语法(我在这里没有选择) 如果你能解释一下为什么会发生这种情况,以及将来如何避免这个问题,我会非常感激(正如你所看到的,我仍在学习)。另外,如果你看到其他错误,请告诉我。提前感

我有一个相当愚蠢的问题,但我在任何地方都找不到解决办法

我正试图编写一个程序,将内存中的两个数字逐段(32位)相加(带进位),并将部分和写入堆栈。不幸的是,不知道为什么,循环计数器在
inc%ecx
之后没有增加。(我在gdb中进行了测试,
%ecx
即使在
inc
指令之后仍然保持在
0

我是为英特尔体系结构编写的,但是使用AT&T语法(我在这里没有选择)


如果你能解释一下为什么会发生这种情况,以及将来如何避免这个问题,我会非常感激(正如你所看到的,我仍在学习)。另外,如果你看到其他错误,请告诉我。提前感谢。

您似乎在64位系统上汇编代码。因此,汇编程序默认为64位二进制文件。这种二进制文件中的所有代码都将作为64位代码执行。指令

.code32
使汇编程序发出32位代码,但不改变处理器解释指令的方式;它会将您的代码解释为64位代码。要使汇编程序生成32位对象文件(处理器将其解释为32位代码),您需要在命令行上传递一个特殊开关:

as --32 code.s
现在为什么要跳过
inc
?在x86处理器上,32位模式与64位模式非常相似,因此大多数指令都执行相同的操作。通常,引入了一组新的前缀来区分32位指令和64位指令。由于这些新前缀没有可用的操作码,因此操作码
40
4f
(意思是
inc r32
dec r32
)被重新调整用途。
inc
dec
指令仍采用不同的双字节编码。因此,处理器“跳过”了
inc
,而是更改了下一条指令


除非您正在做非常奇怪的事情(例如编写引导加载程序),否则您永远不应该需要
.code32
指令。忘记它的存在。请注意,不应使用
int$0x80
以64位代码进行系统调用,因为这些系统调用只接受32位指针。在64位代码中,对系统调用使用
syscall
,但请注意,系统调用号码和调用约定都不同。

正如我在另一个答案下所写的,它确实有帮助(在删除
.code 32
后修复
推送的操作数)。谢谢你的解释和提示,应该可以帮我省去一些麻烦。@Newb因为你的老师似乎在教32位汇编,如果你只是用
--32
标志作为32位程序进行汇编可能会更好。总是乐于助人!我可能会摆弄那面旗帜,但现在,我很高兴我有了一些工作可以依靠,以防出了什么问题/我没时间了。
as --32 code.s