我正在制作一个32位保护模式的操作系统,需要增加(或减少)一个变量。我的变量是这样定义的:
Var: db 1
我试着像这样增加它:
mov ebx, [Var]
inc ebx
mov [Var], ebx
但是,该变量增加了一个值WAY比1大。为什么会发生这种情况,我该如何解决它
您的问题是您将Var
定义为字节大小的变量,但是您对它进行操作,就好像它是dword大小的变量一样。这会导致您在变量周围读/写不相关的字节,从而导致您观察到的奇怪数字。
要解决这个问题,总是用正确的数据大小操作数据。例如,do
movzx ebx, byte [Var]
inc ebx
mov [Var], bl
注意不对称:我们可以使用mov bl, byte ptr [Var]
,但是写入部分寄存器很慢(即bl
是ebx
的一部分)。指令movzx
确保写入整个寄存器,同时只从内存中取出一个字节。
或者更简单的
inc byte [Var]