汇编语言--变量及数值操作

在高级语言中,变量和数值操作是很基本的语法,基本所有语言都有,但是其在汇编级别上是怎么实现的?或者拓展了说,在计算机上,变量和数值操作的实现逻辑是怎样的?

主要内容

  • 汇编与机器码
    首先,我们要知道,在计算机架构中,最重要的两层抽象是指令集和虚拟内存。前者是所有计算机程序的最小逻辑单元,即所有的计算机程序,都会被转换为一连串的计算机指令并运行。而虚拟内存则是计算机对程序可访问内存的一层抽象,因为这层抽象存在,每一个运行在计算机上的程序可以认为内存是一个只有自己和OS在使用超级大的字节数据。

    而计算机上存储、使用的数据都是二进制数(机器码)的形式,因此,所有的计算机指令都会被转换为对应的二进制数,计算机最终会根据这些不同的二进制数执行相应的计算机指令。但是二进制数是机器的语言,如果我们要直接使用二进制数进行编程,先不提各个机器上的相同指令对应机器码之间的差异性和代码的可读性问题,记忆各个指令对应的二进制数无疑是困难的。而如果我们设计一种人类可以很容易理解、记忆的语言,它与计算机指令有一一对应的关系,而我们只要再创建一个计算机指令编译器,将这种新语言转换对应的机器码,即解决了上述提到的各个问题。

    而汇编语言就是上面说的“新语言”,它只是对各个计算机指令二进制数的简单字符抽象,汇编语言的格式与编译器最终转换为的二进制数形式数据并没太大区别。下面是一个简单的代码实例:
    【待补充】

  • 数据类型
    在计算机上没有常规意义的数据类型的概念,即没有Integer,String类型之分。在 汇编语言中,只存在不同长度的二进制数,但是使用二进制数时,指令参数只有以下三种:

    1. 标量,例如$1$22,当它出现在指令参数时,参数的值就是其对应的二进制数,$符号只是在汇编的写法习惯,在实际的二进制代码中并不存在$前缀。
    2. 寄存器,例如%rax%rsi,当它出现在指令参数时,表示的值为存储在寄存器中的二进制数。和上面的标量表示一样,汇编的写法上一般会在寄存器名前加上%做为标识。使用寄存器作为参数时,需要注意,当指令要操作不同长度的二进制数时,我们要使用对应长度的寄存器名。例如,寄存器%rax的64位、32位、16位和8位的名称分别为%rax%eax%ax%al,那么当计算机指令操作16位数据时,需要用%ax标识该寄存器,8位则使用%al,需要与指令类型严格一致。
    图片来自《深入理解计算机系统》
    1. 内存数据,例如0x100(%rdi),当指令参数没有$|%前缀时,那么他就表示的是存放在内存某个位置的二进制数。这个时候,该二进制数的长度只取决于指令类型。 ()表示的是一种特殊的内存地址计算规则,计算规则为:
      汇编语言内存计算.PNG
      例如,100(, %rdi, 2),其中%rdi的值为0x1,则最终结果为100 + 1 * 2 = 102,即内存地址为102。
  • 访问数据(未完)

  • 算术逻辑操作

思考:

  • 在汇编语言中,如何表示高级语言中的变量?
    在高级语言中,变量往往就代表着程序的操作对象,可以作为计算结果的存储地点、程序的操作对象,甚至可以表示一段程序的执行过程。但是对于汇编语言来说,不管是可操作的数据,还是计算机指令本身,都只是一连串的二进制数,这些二进制数的具体含义,仅依赖于其在汇编程序中的上下文(指令类型及参数位置)。
    但是在汇编语言中并不存在变量的概念,汇编语言的操作对象是各个寄存器和内存数据,那么汇编语言是怎么表示高级语言中变量的语义的呢?
    我们先看一段代码,对于C语言函数:
    void concat_char(char a, char b, char *dest){
      dest[0] = a;
      dest[1] = b;
    }
    
    其转换的汇编语言可能是这样的:
    concat_char:
      movb  %dil, (%rdx)          %dil表示第一个参数所在的寄存器,%rdx表示第三个参数所在寄存器地址,由于第三个参数是指针,因此需要加上()表示取其指向的内存地址
      movb  %sil, (%rdx, $1, 1)   %sil表示第二个参数所在的寄存器,$1表示标量,即$1就表示了数值1,(%rdx, $1, 1)的语义为(%rdx + 1 * 1)指向的内存地址
      ret                         表示函数结束
    
    上面的汇编代码中,movb表示移动一个字节,参数有两个,第一个参数为源地址,第二个参数为目标地址。从上面汇编代码可以看出,对于汇编语言,不同的参数类型只代表着不同的数据大小。
    即使考虑更复杂的变量类型 ---- JAVA中的对象,其存储于计算机中也只是一连串的二进制数据,对于汇编语言来说也只有使用上的区别,即JVM转换为机器码时,可能会以不同的指令(同一类型指令,但是操作不同大小的数据)去操作对应对象数据的各个一部分(对应着对象实例的不同的字段类型),但是变量本身却只对应着某个寄存器或某个内存地址。
    总的来说,我们或许可以这样认为,在汇编语言并不存在变量的概念,但是我们可以通过操作不同数据大小的不同指令,结合寄存器和内存地址来模拟实现变量的效果。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容