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