-
取有效地址,一般用来计算表达式
-
lea
8(%rax, %rax, 2), %rbx
// rbx = 3rax + 8
直接取寄存器中的值
-
8(%rax, %rax, 2)
也表示一个
内存值
但 lea
只取内存的有效地址即 3rax + 8
-
区别:
lea 直接取地址
mov 需要对地址进行引用取内存值
一、mov 指令mov 8(%rax, %rax, 2), %rbx // rbx = M[3rax + 8]8(%rax, %rax, 2) 表示内存地址为3rax + 8的内存值二、lea 指令取有效地址,一般用来计算表达式lea 8(%rax, %rax, 2), %rbx // rbx = 3rax + 8 直接取寄存器中的值8(%rax, %rax, 2) 也表示一个内存值 但 lea 只取内存的有效地址即 3rax + 8区别:lea 直接取地址 mov 需
mov
默认对寄存器值或变量值进行操作,可以从寄存器到寄存器,从立即数到寄存器,从存储单元到寄存器,从立即数到存储单元,从寄存器到存储单元,【从寄存器或存储单元到段寄存器(除CS寄存器),立即数不能值接送段寄存器】
(1)
MOV
指令
中的源操作数绝对不能是立即数和代码段CS寄存器;
(2)
MOV
指令
中绝对不允许在两个存储单元之间直接传送数据;
(3)
MOV
指令
中绝对不允许在两个...
本文是《go调度器源代码情景分析》系列 第一章 预备知识的第4小节。
汇编
语言是每位后端程序员都应该掌握的一门语言,因为学会了
汇编
语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣的读者可以多花点时间把它学好。
与高级编程语言一样,
汇编
语言也是一门完整的计算机编程语言,它所涉及的知识内容也很多,好在我们的主要目标是通过对本小节的学习而有能力去读...
刚开始学
汇编
都会接触到
指令
lea
和
mov
,但是这两个
指令
用法看起来很像,会经常误以为两者其实没有很大
区别
,甚至会误认为两者就是相等的,笔者本人也是很迷,而且书上对
lea
的讲解又十分有限,但是通过不懈的知识搜素,终于搞明白了这其中的差别,两者还是又很大不同的。
让我们一起看看下面的例子:
大家可以看到,第三行和第四行,看到右边的注释大家是不是有点明白了呢,
lea
代表的就是加载有效地址(load effective address),而(%rsi , %rdi , 4)代表的是以数值 %rsi + %r
汇编
指令
与高级编程语言一样,
汇编
语言也是一门完整的计算机编程语言,其涉及到的内容和知识点有很多,本文会介绍
汇编
语言下的子集-
汇编
指令
,旨在让各位看完本文之后有能力读懂goroutine调度器中的
汇编
代码。
聊
汇编
指令
之前,先聊一下机器
指令
。
二进制的机器
指令
才是CPU能够读懂的机器语言,因其是二进制格式的,非常便于CPU解析和执行,但对编程人员来说不是很友好,所以才有与机器
指令
相对应的
汇编
指令
,它使用符号来表示机器
指令
。
看个例子感受下:
0x40054d : add %rdx,%rax //
以下是个人的感觉,不太确定对错,但是测试过好像是这样。
之前挺好奇
mov
和
lea
有什么
区别
,说是一个是传值一个传地址,的确好像是这样。
mov
的源操作数和目标操作数,其中目标操作数不能是立即数,且源操作数与目标操作数不能同时是存储器(内存地址)。
lea
的源操作数只能是有效地址,目标操作数只能是寄存器。
两者在操作一些内存地址上意思好像是一样的。
比如0x8151...
ATT
格式
汇编
——
mov
与
lea
的
区别
1.
mov
数据传送
指令
,目的操作数不能是立即数,数据不能从内存直接传送到内存(若需要,转化成2条
指令
,从内存取数据到寄存器,从寄存器到内存)
2.
lea
lea
(load effective address)其实是
mov
的变形,它的源操作数看上去是一个内存引用,但并非从指定位置读入数据,而是将有效地址写入到目的操作数,目的操作时只能为寄存器 ...