《深入理解计算机系统》第三章
3.4.2数据传送指令
规则总结:
(1)操作指令后缀与寄存器的长度必须一致。
(2)X86-64应用内存的寄存器必须是4字(8字节)的。
(3)MOV命令中,两个操作数只允许有一个是内存应用。
后缀 | 字 | 字节 |
---|---|---|
b | ` | 1字节 |
w | 1字 | 2字节 |
l | 2字 | 4字节 |
q | 4字 | 8字节 |
3.5.3位移操作
在虚拟机 Ubantu下做仿真实验
Ubuntu下
root@ubuntu:/mnt# vi code.c
vi 界面下 C代码
#include<stdio.h>
int shift(long x,long n)
{
x>>=4;
x<<=n;
return x;
}
Ubuntu下
root@ubuntu:/mnt# gcc -O1 -S code.c -o code.s
root@ubuntu:/mnt# vi code.s
vi 界面下查看汇编代码
.file "shift.c"
.text
.globl shift
.type shift, @function
shift:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
sarl $4, %eax
movl 12(%ebp), %ecx
sall %cl, %eax
popl %ebp
ret
.size shift, .-shift
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
.section .note.GNU-stack,"",@progbits
Ubuntu下 查看机器码
root@ubuntu:/mnt# gcc -O1 -c shift.c -o code.o
root@ubuntu:/mnt# ls
shift.c shift.o shift.s
root@ubuntu:/mnt# vi shift.o
root@ubuntu:/mnt# objdump -d shift.o
shift.o: file format elf32-i386
Disassembly of section .text:
00000000 <shift>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 8b 45 08 mov 0x8(%ebp),%eax
6: c1 f8 04 sar $0x4,%eax
9: 8b 4d 0c mov 0xc(%ebp),%ecx
c: d3 e0 shl %cl,%eax
e: 5d pop %ebp
f: c3 ret
3.7.4栈上的局部存储
#include<stdio.h>
void proc(long a1,long *a1p,int a2,int*a2p,short a3,short *a3p,char a4,char *a4p)
{
*a1p+=a1;
*a2p+=a2;
*a3p+=a3;
*a4p+=a4;
}
long acll_proc()
{
long x1=1;int x2=2;
short x3=3; char x4=4;
proc(x1,&x1,x2,&x2,x3,&x3,x4,&x4);
return(x1+x2)*(x3+x4);
}
root@ubuntu:/mnt# objdump -d proc.c
objdump: proc.c: File format not recognized
root@ubuntu:/mnt# objdump -d proc.o
proc.o: file format elf32-i386
Disassembly of section .text:
00000000 <proc>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 08 sub $0x8,%esp
6: 8b 55 18 mov 0x18(%ebp),%edx
9: 8b 45 20 mov 0x20(%ebp),%eax
c: 66 89 55 fc mov %dx,-0x4(%ebp)
10: 88 45 f8 mov %al,-0x8(%ebp)
13: 8b 45 0c mov 0xc(%ebp),%eax
16: 8b 00 mov (%eax),%eax
18: 89 c2 mov %eax,%edx
1a: 03 55 08 add 0x8(%ebp),%edx
1d: 8b 45 0c mov 0xc(%ebp),%eax
20: 89 10 mov %edx,(%eax)
22: 8b 45 14 mov 0x14(%ebp),%eax
25: 8b 00 mov (%eax),%eax
27: 89 c2 mov %eax,%edx
29: 03 55 10 add 0x10(%ebp),%edx
2c: 8b 45 14 mov 0x14(%ebp),%eax
2f: 89 10 mov %edx,(%eax)
31: 8b 45 1c mov 0x1c(%ebp),%eax
34: 0f b7 00 movzwl (%eax),%eax
37: 89 c2 mov %eax,%edx
39: 0f b7 45 fc movzwl -0x4(%ebp),%eax
3d: 8d 04 02 lea (%edx,%eax,1),%eax
40: 89 c2 mov %eax,%edx
42: 8b 45 1c mov 0x1c(%ebp),%eax
45: 66 89 10 mov %dx,(%eax)
48: 8b 45 24 mov 0x24(%ebp),%eax
4b: 0f b6 00 movzbl (%eax),%eax
4e: 89 c2 mov %eax,%edx
50: 0f b6 45 f8 movzbl -0x8(%ebp),%eax
54: 8d 04 02 lea (%edx,%eax,1),%eax
57: 89 c2 mov %eax,%edx
59: 8b 45 24 mov 0x24(%ebp),%eax
5c: 88 10 mov %dl,(%eax)
5e: c9 leave
5f: c3 ret
00000060 <acll_proc>:
60: 55 push %ebp//将调用方的栈底地址入栈。栈由高地址向低地址增长的
61: 89 e5 mov %esp,%ebp//esp堆栈指针,指向栈顶;ebp基址地址,指向当前函数栈底
63: 56 push %esi
64: 53 push %ebx
65: 83 ec 30 sub $0x30,%esp//编译器事先扫描函数中局部变量的个数和大小,预分配30字节栈帧,存储局部变量和参数调用。
68: c7 45 f0 01 00 00 00 movl $0x1,-0x10(%ebp)//将局部变量压栈。
6f: c7 45 ec 02 00 00 00 movl $0x2,-0x14(%ebp)
76: 66 c7 45 f4 03 00 movw $0x3,-0xc(%ebp)
7c: c6 45 f7 04 movb $0x4,-0x9(%ebp)
80: 0f b6 45 f7 movzbl -0x9(%ebp),%eax
84: 0f be d8 movsbl %al,%ebx
87: 0f b7 45 f4 movzwl -0xc(%ebp),%eax
8b: 0f bf c8 movswl %ax,%ecx
8e: 8b 55 ec mov -0x14(%ebp),%edx
91: 8b 45 f0 mov -0x10(%ebp),%eax
94: 8d 75 f7 lea -0x9(%ebp),%esi//生成指向存储 $0x4位置“-0x9(%ebp)”的指针&x4。
97: 89 74 24 1c mov %esi,0x1c(%esp)//&x4—%esp+0x1c
9b: 89 5c 24 18 mov %ebx,0x18(%esp)//x4-%esp+0x18
9f: 8d 5d f4 lea -0xc(%ebp),%ebx
a2: 89 5c 24 14 mov %ebx,0x14(%esp)//&x3—%esp+0x14
a6: 89 4c 24 10 mov %ecx,0x10(%esp)//x3-%esp+0x10
aa: 8d 4d ec lea -0x14(%ebp),%ecx
ad: 89 4c 24 0c mov %ecx,0xc(%esp)//&x2-%esp+0xC
b1: 89 54 24 08 mov %edx,0x8(%esp)//x2-%esp+0x8
b5: 8d 55 f0 lea -0x10(%ebp),%edx
b8: 89 54 24 04 mov %edx,0x4(%esp)//&x1-%esp+0x4
bc: 89 04 24 mov %eax,(%esp)//x1-%esp+0x0
bf: e8 fc ff ff ff call c0 <acll_proc+0x60>
c4: 8b 55 f0 mov -0x10(%ebp),%edx
c7: 8b 45 ec mov -0x14(%ebp),%eax
ca: 8d 0c 02 lea (%edx,%eax,1),%ecx
cd: 0f b7 45 f4 movzwl -0xc(%ebp),%eax
d1: 0f bf d0 movswl %ax,%edx
d4: 0f b6 45 f7 movzbl -0x9(%ebp),%eax
d8: 0f be c0 movsbl %al,%eax
db: 8d 04 02 lea (%edx,%eax,1),%eax
de: 0f af c1 imul %ecx,%eax
e1: 83 c4 30 add $0x30,%esp
e4: 5b pop %ebx
e5: 5e pop %esi
e6: 5d pop %ebp
e7: c3 ret
- 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎