3

如果我在 .data 下声明我的变量,它们被视为全局变量,我如何在本地声明它们

@paul我可以分配内存,但是我如何输入它们(例如有符号和无符号整数)

4

1 回答 1

4

汇编代码中局部变量的声明取决于您的汇编程序,它可能根本不支持此类声明。

通常,局部变量是通过移动(递减)堆栈指针来分配的。如果使用 push 指令,堆栈上的局部变量的分配和初始化可以融合在一起,该指令推进堆栈指针并写入堆栈。这个例子:

; input: eax = some integer >= 1
; output: eax = factorial of the integer
; used registers: ebx, eflags
factorial:
cmp   eax, 1
je    factorial_end
push  eax ; created a local variable on the stack
dec   eax
call  factorial
pop   ebx ; destroyed a local variable on the stack
mul   ebx
factorial_end:
ret

至于签名,未签名和铸造,在汇编中没有这样的事情。CPU 完全按照您的指示行事。他们不解释输入或输出,是你,程序员做出解释。因此,如果要将两个整数除以无符号DIV数,则使用整数的值执行,如果要进行有符号除法,则对IDIV指令执行相同操作。如果您使用IDIV您认为是无符号整数(或DIV在有符号整数上),CPU 会很乐意为您执行此操作,错误的结果(或除法溢出异常)将是您要处理的问题。幸运的是,无符号整数和 2 的补码有符号整数的加法、减法和乘法是由 CPU 以相同的方式对这两种整数进行的,您不需要做任何特别的事情,比如为每种整数选择正确的指令。通常,有符号整数和无符号整数之间只有除法和比较不同。但同样,您在代码中明确处理了这种差异。

于 2013-01-28T17:02:24.667 回答