如果我在 .data 下声明我的变量,它们被视为全局变量,我如何在本地声明它们
@paul我可以分配内存,但是我如何输入它们(例如有符号和无符号整数)
汇编代码中局部变量的声明取决于您的汇编程序,它可能根本不支持此类声明。
通常,局部变量是通过移动(递减)堆栈指针来分配的。如果使用 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 以相同的方式对这两种整数进行的,您不需要做任何特别的事情,比如为每种整数选择正确的指令。通常,有符号整数和无符号整数之间只有除法和比较不同。但同样,您在代码中明确处理了这种差异。