栈指令 指令效果描述pushq S %rsp ← %rsp - 8将四字压入栈 (%rsp) ← Spopq D D ← (%rsp)将四字弹出栈 %rsp ← %rsp + 8 需要注意的点 pushq指令的行为等价于:subq $8, %rsp 与movq %rbp, (%rsp)两条指令的合效果。 popq指令的行为等价于: movq (%rsp), %rax 与addq $8, %rsp两条指令的合效果。 push/pop指令不存在其他后缀。 算数和逻辑指令 指令效果描述leaq S , DD ← &S加载有效地址inc DD ← D + 1加一dec DD ← D - 1减一neg DD ← -D取负not DD ← ~D取补add S , DD ← D + S加sub S , DD ← D - S减imul S , DD ← D * S乘div S , DD ← D ÷ S除xor S , DD ← D ^ S异或or S , DD ← D | S或and S , DD ← D & S与 继续阅读 >>


娄泽豪 17/06/02 11:36:21
数据传输指令的形式 指令效果描述 mov S, DD ← S 传送 movb 传送字节 movw 传送字 movl 传送双字 movq 传送四字 movabsq I, RD ← S 传送绝对的四字 需要注意的点 传送指令的两操作数不可均为内存位置。 movl在以寄存器作为目的时,会把寄存器的高位设为0 例子:分别执行movabsq $0xABCDEF0123456789, %r8和movl $0xFFFFFFFF, %r8d,此时%r8寄存器的值为00000000FFFFFFFF movq仅可以操作32位补码的立即数,而movabsq仅可以以寄存器为目的地 符号扩展/零扩展 零扩展 指令效果描述 movz S, RR ← (零扩展)S 以零扩展进行传送 movzbw 将做了零扩展的字节传送到字 movzbl 将做了零扩展的字节传送到双字 movzwl 将做了零扩展的字传送到双字 movzbq 将做了零扩展的字节传送到四字 movzwq 将做了零扩展的字传送到四字 继续阅读 >>


娄泽豪 17/05/30 20:51:40
数据格式 C声明 Intel数据类型 汇编代码后缀 大小(字节) char 字节 b 1 short 字 w 2 int 双字 l 4 long 四字 q 8 char * 四字 q 8 float 单精度 s 4 double 双精度 l 8 寄存器 主要用途 64位寄存器名 32位寄存器名 16位寄存器名 8位寄存器名 存储返回值 %rax %eax %ax %al 被调用者保存 %rbx %ebx %bx %bl 第四个参数 %rcx %ecx %cx %cl 第三个参数 %rdx %edx %dx %dl 第二个参数 %rsi %esi %si %sil 第一个参数 %rdi %edi %di %dil 继续阅读 >>


娄泽豪 17/05/30 19:57:12
程序中图的表示 邻接链表法 对于图G = (V, E),我们可以将之视为邻接链表的组合,该种表示方法在表示稀疏图(即边的条数|E|远远小于|V| ^ 2的图)时空间利用效率高而成为表示稀疏图,甚至是稠密图的主要方法之一。 对于上述例图,使用邻接链表的表示形式示意图如下: 不难从例子中总结出,对于图G = (V, E)来说,其邻接链表表示由一个包含|V|条链表的数组Adj组成,每个结点有一条链表。对于每一个结点u∈V,邻接链表Adj[u]包含所有与结点u之间有边相连的结点v,即Adj[u]包含图G中所有与u邻接的结点(也可以实现为链表中包含指向这些结点的指针)。 对于邻接链表表示而言,结点u的所有邻边的集合Adj[u]可以看做是图的一种属性。 邻接矩阵法 对于图G = (V, E),我们还可以将之表示为一个矩阵,该种表示方法在表示稀疏图时空间利用效率显然较低,但在表示稠密图时因为其实现形式较之邻接链表法难度显然降低,因此不失为一种好的选择。此外,邻接矩阵法的另一优势也体现在,对于任一边(u, v),邻接矩阵法表示可以在O 继续阅读 >>


娄泽豪 17/05/30 17:29:29
#include<iostream> #include<string> #include<map> using namespace std; const int MAXDATA = 100000; map<string, bool> vis; void shuffle(string &r, string &s1, string &s2) { r.clear(); string::iterator iter, jter; for (iter = s1.begin(), jter = s2.begin(); iter != s1.end(); ++iter, ++jter) { r += *jter; r += *iter; } } void update(string t, string &s1, string &s2) { s1.clear(); s2.clear(); size_t 继续阅读 >>


娄泽豪 17/05/25 19:17:23
#include<iostream> #include<algorithm> #include<string> using namespace std; int main() { string st; while (getline(cin, st)) { char max = *max_element(st.begin(), st.end()); for (auto i : st) { cout << i; if (i == max) cout << "(max)"; } cout << endl; } return 0; } 作者:hepangda 发表于2017/5/25 19:09:12 原文链接 继续阅读 >>


娄泽豪 17/05/25 19:09:12
#include<iostream> #include<queue> #include<cstring> using namespace std; const int MAXDATA = 1005; const int NOTV = -1; const int OPR[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0}; struct d2Pos { int x, y, d; }; int X__, Y__, R__; char g[MAXDATA][MAXDATA]; int fire[MAXDATA][MAXDATA], joev[MAXDATA][MAXDATA]; queue<d2Pos> fireQ; d2Pos joe; void readg() { R__ = 0; while (!fireQ.empty()) fireQ.pop(); cin >> X__ >> Y__; for 继续阅读 >>


娄泽豪 17/05/25 18:59:36
#include<iostream> #include<string> using namespace std; string numlize(string n); int main(void) { string n1, n2; while (cin >> n1 >> n2) { if (numlize(n1) == numlize(n2)) cout << "YES" << endl; else cout << "NO" << endl; } return 0; } string numlize(string n) { int pos, i; pos = n.find('.'); if (pos >= 0) { for (i = n.size() - 1; i >= pos - 1; i--) 继续阅读 >>


娄泽豪 17/05/25 18:56:05
Range-based For 的一般形式 想要遍历C++的各个容器类型以及原生数组,除了使用下标以及迭代器访问之外,还可以使用C++11的一种新的for循环形式,Range-based For。其一般的形式: for (declaration : expression) { statement; } 以下是一个使用的例子: #include<iostream> int main() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (auto it : a) { std::cout << it << ' '; } return 0; } 打开编译器的”std=c++11”选项,可以得到输出 1 2 3 4 5 6 7 8 9 10 有关 Range-based For 输出顺序 在标准STL容器中,使用Range-based For得到的输出与使用其iterator得到 继续阅读 >>


娄泽豪 17/05/24 19:43:14
可以解决那些问题? 一般性的问题叙述 已知一个带权重的有向图G=(V,E) 和权重函数 ω:E→R (该权重函数将有向图中的每条边)映射他的权重。图中任一路径 p= <v0,v1,…,vk› 的长度就是构成该路径所有边的权重之和: 那么从结点u到结点 v的最短路径δ(u,v)被定义为: 最短路径的变体 单目的地最短路径问题 即找到从每个节点u到给定目的地结点t的最短路径。可以将图的每个边翻转,即化为了单源最短路径问题。 单结点对最短路径问题 即找到从给定结点 u到给定结点 v的最短路径。在解决结点u或者结点v的单源最短路径问题时,自然而然的解决了这个问题。 最短路径的最优子结构 最短路径算法通常依赖最短路径的一个重要性质:两个结点之间的一条最短路径包含着其他的最短路径。 解决问题需要的算法基础 最短路径估计 对于每个节点v而言,我们维持一个属性v.d,用来记录从源节点s到该节点的最短路径的上界。称v.d为s到v的最短路径估计。 除此之外,我们还维护一个属性v.π,用于指向从源节点到达该 继续阅读 >>


娄泽豪 17/05/22 19:44:05