疫情在家,彻底弄清常量和变量的区别

318 阅读1分钟

在所有的语言中,牵涉到常量,都是无法修改的。我们一起从汇编的角度看看其中的原因吧。

概括

常量是程序中使用的一个确定数值,在编译阶段就可以确定,直接编码于指令代码中,不是保存在存储器中可变的变量,而是编码在指令中的量,和指令一起存储了,所以也就没法动态改变它了,这也正是高级语言常量无法修改的原因。

结合demo的描述

assume cs:code,ds:data
 
data segment
  AGES DB 21H,23H,33H,52H,65H    ; 变量
data ends
 
code segment
  boo   =   11h    ; 常量
  start:
        mov ax,data
        mov ds,ax
        mov bx,boo
        mov dx,[0]
        mov cx,[1]
 
        mov ax,4c00h
        int 21h
code ends
end start

变量储存位置:内存中data段。在调试代码的过程中,076A是data段的段基址。通过debug指令可以看到data段的二进制。图中的21,23,33,52,65对应我们定义的变量。

image.png

常量储存位置:内存中code段。通过debug指令可以查看code段的二进制。将其翻译为汇编指令后如下图所示。

源码中的mov bx,boo被编译为了MOV BX,0011。所以常量在编译时就能确定值,其值储存在code段中。

image.png