Microsoft Word - AT&T2_bold.doc

Size: px
Start display at page:

Download "Microsoft Word - AT&T2_bold.doc"

Transcription

1 AT&T 汇编语言与 GCC 内嵌汇编简介 版本 0.1 时间 04/3/30

2 1 AT&T 与 INTEL 的汇编语言语法的区别 大小写 操作数赋值方向 前缀 间接寻址语法 后缀 指令 GCC 内嵌汇编 简介 内嵌汇编举例 语法 汇编语句模板 输出部分 输入部分 限制字符 破坏描述部分 GCC 如何编译内嵌汇编代码 后记...20

3 本节先介绍 AT&T 汇编语言语法与 INTEL 汇编语法的差别, 然后介绍 GCC 内嵌汇编语法 阅读本节需要读者具有 INTEL 汇编语言基础 1 AT&T 与 INTEL 的汇编语言语法的区别 1.1 大小写 例 : INTEL 格式的指令使用大写字母, 而 AT&T 格式的使用小写字母 INTEL MOV EAX,EBX AT&T movl %ebx,%eax 1.2 操作数赋值方向 在 INTEL 语法中, 第一个表示目的操作数, 第二个表示源操作数, 赋值方向从右向左 AT&T 语法第一个为源操作数, 第二个为目的操作数, 方向从左到右, 合乎自然 例 : INTEL AT&T MOV EAX,EBX movl %ebx,%eax 1.3 前缀 在 INTEL 语法中寄存器和立即数不需要前缀 ;AT&T 中寄存器需要加前缀 % ; 立即数需要加前缀 $ 例 : INTEL AT&T MOV EAX,1 movl $1,%eax 符号常数直接引用, 不需要加前缀, 如 :movl value, %ebx,value 为一常数 ; 在符 号前加前缀 $ 表示引用符号地址, 如 movl $value, %ebx, 是将 value 的地址放到 ebx 中 总线锁定前缀 lock : 总线锁定操作 lock 前缀在 Linux 核心代码中使用很多, 特 别是 SMP 代码中 当总线锁定后其它 CPU 不能存取锁定地址处的内存单元

4 远程跳转指令和子过程调用指令的操作码使用前缀 l, 分别为 ljmp,lcall, 与之相应的返回指令伪 lret 例 : INTEL AT&T CALL FAR SECTION:OFFSET lcall $secion:$offset JMP FAR SECTION:OFFSET ljmp $secion:$offset RET FAR SATCK_ADJUST lret $stack_adjust 1.4 间接寻址语法 INTEL 中基地址使用 [ ], 而在 AT&T 中使用 ( ) ; 另外处理复杂操作数的 语法也不同,INTEL 为 Segreg:[base+index*scale+disp], 而在 AT&T 中为 %segreg:disp(base,index,sale), 其中 segreg,index,scale,disp 都是可选的, 在指定 index 而没有显式指定 Scale 的情况下使用默认值 1 Scale 和 disp 不需要加前缀 & INTEL AT&T Instr foo,segreg:[base+index*scale+disp] instr %segreg:disp(base,index,scale),foo 1.5 后缀 AT&T 语法中大部分指令操作码的最后一个字母表示操作数大小, b 表示 byte( 一个字节 ); w 表示 word(2 个字节 ); l 表示 long(4 个字节 ) INTEL 中处理内存操作数时也有类似的语法如 :BYTE PTR WORD PTR DWORD PTR 例 : INTEL AT&T mov al, bl movb %bl,%al mov ax,bx movw %bx,%ax mov eax, dword ptr [ebx] movl (%ebx), %eax 在 AT&T 汇编指令中, 操作数扩展指令有两个后缀, 一个指定源操作数的字长, 另一个指定目标操作数的字长 AT&T 的符号扩展指令的为 movs, 零扩展指令为 movz ( 相应的 Intel 指令为 movsx 和 movzx ) 因此, movsbl %al,%edx 表示对寄存器 al 中的字节数据进行字节到长字的符号扩展, 计算结果存放在寄存器 edx 中 下面是一些允许的操作数扩展后缀 : bl: 字节 -> 长字 bw: 字节 -> 字 wl: 字 -> 长字 例 : 跳转指令标号后的后缀表示跳转方向, f 表示向前 (forward), b 表示向后 (back)

5 jmp 1f 1: jmp 1f 1: 1.6 指令 INTEL 汇编与 AT&T 汇编指令基本相同, 差别仅在语法上 关于每条指令的语法可以参 考 I386 Manual 2 GCC 内嵌汇编 2.1 简介 内核代码绝大部分使用 C 语言编写, 只有一小部分使用汇编语言编写, 例如与特定体系 结构相关的代码和对性能影响很大的代码 GCC 提供了内嵌汇编的功能, 可以在 C 代码中直 接内嵌汇编语言语句, 大大方便了程序设计 简单的内嵌汇编很容易理解例 : asm volatile ("hlt"); asm 表示后面的代码为内嵌汇编, asm 是 asm 的别名 volatile 表示编译器不要优化代码, 后面的指令保留原样, volatile 是它的别名 括号里面是汇编指令 2.2 内嵌汇编举例 在内嵌汇编中, 可以将 C 语言表达式指定为汇编指令的操作数, 而且不用去管如何将 C 语言表达式的值读入哪个寄存器, 以及如何将计算结果写回 C 变量, 你只要告诉程序中 C 语言表达式与汇编指令操作数之间的对应关系即可, GCC 会自动插入代码完成必要的操作 使用内嵌汇编, 要先编写汇编指令模板, 然后将 C 语言表达式与指令的操作数相关联, 并告诉 GCC 对这些操作有哪些限制条件 例如在下面的汇编语句 : asm violate ("movl %1,%0" : "=r" (result) : "m" (input)); movl %1,%0 是指令模板 ; %0 和 %1 代表指令的操作数, 称为占位符, 内嵌汇编靠它们将 C 语言表达式与指令操作数相对应 指令模板后面用小括号括起来的是 C 语言表达式, 本例中只有两个 : result 和 input, 他们按照出现的顺序分别与指令操作数 %0, %1 对应 ; 注意对应顺序 : 第一个 C 表达式对应 %0 ; 第二个表达式对应 %1, 依次类推, 操作数至多有 10 个, 分别用 %0, %1. %9 表示 在每个操作数前面有一个

6 用引号括起来的字符串, 字符串的内容是对该操作数的限制或者说要求 result 前面的限制字符串是 =r, 其中 = 表示 result 是输出操作数, r 表示需要将 result 与某个通用寄存器相关联, 先将操作数的值读入寄存器, 然后在指令中使用相应寄存器, 而不是 result 本身, 当然指令执行完后需要将寄存器中的值存入变量 result, 从表面上看好像是指令直接对 result 进行操作, 实际上 GCC 做了隐式处理, 这样我们可以少写一些指令 input 前面的 r 表示该表达式需要先放入某个寄存器, 然后在指令中使用该寄存器参加运算 我们将上面的内嵌代码放到一个 C 源文件中, 然后使用 gcc c S 得到该 C 文件源代码 相对应的汇编代码, 然后查看一下汇编代码, 看看 GCC 是如何处理的 C 源文件如下内容如下, 注意该代码没有实际意义, 仅仅作为例子 extern int input,result; void test(void) { input = 1; asm volatile ("movl %1,%0" : "=r" (result) : "r" (input)); return ; } 对应的汇编代码如下 ; 行号 代码 解释 movl $1, input 对应 C 语言语句 input = 1; 9 movl input, %eax 10 #APP GCC 插入的注释, 表示内嵌汇编开始 11 movl %eax,%eax 我们的内嵌汇编语句 12 #NO_APP GCC 插入的注释, 表示内嵌汇编结束 13 movl %eax, result 将结果存入 result 变量 从汇编代码可以看出, 第 9 行和第 13 行是 GCC 自动增加的代码,GCC 根据限定字符串决定如何处理 C 表达式, 本例两个表达式都被指定为 r 型, 所以先使用指令 : movl input, %eax 将 input 读入寄存器 %eax;gcc 也指定一个寄存器与输出变量 result 相关, 本例也是 %eax, 等得到操作结果后再使用指令 : movl %eax, result 将寄存器的值写回 C 变量 result 中 从上面的汇编代码我们可以看出与 result 和 input 相关连的寄存器都是 %eax,gcc 使用 %eax 替换内嵌汇编指令模板中的 %0,%1: movl %eax,%eax 显然这一句可以不要 但是没有优化, 所以这一句没有被去掉

7 由此可见,C 表达式或者变量与寄存器的关系由 GCC 自动处理, 我们只需使用限制字符串指导 GCC 如何处理即可 限制字符必须与指令对操作数的要求相匹配, 否则产生的汇编代码将会有错, 读者可以将上例中的两个 r, 都改为 m (m 表示操作数放在内存, 而不是寄存器中 ), 编译后得到的结果是 : movl input, result 很明显这是一条非法指令, 因此限制字符串必须与指令对操作数的要求匹配 例如指令 movl 允许寄存器到寄存器, 立即数到寄存器等, 但是不允许内存到内存的操作, 因此两个操作数不能同时使用 m 作为限定字符 2.3 语法 内嵌汇编语法如下 : asm ( 汇编语句模板 : 输出部分 : 输入部分 : 破坏描述部分 ) 共四个部分 : 汇编语句模板, 输出部分, 输入部分, 破坏描述部分, 各部分使用 : 格开, 汇编语句模板必不可少, 其他三部分可选, 如果使用了后面的部分, 而前面部分为空, 也需要用 : 格开, 相应部分内容为空 例如 : asm volatile ("cli": : :"memory") 汇编语句模板 汇编语句模板由汇编语句序列组成, 语句之间使用 ; \n 或 \n\t 分开 指令中的操作数可以使用占位符引用 C 语言变量, 操作数占位符最多 10 个, 名称如下 :%0,%1,, %9 指令中使用占位符表示的操作数, 总被视为 long 型 (4 个字节 ), 但对其施加的操作根据指令可以是字或者字节, 当把操作数当作字或者字节使用时, 默认为低字或者低字节 对字节操作可以显式的指明是低字节还是次字节 方法是在 % 和序号之间插入一个字母, b 代表低字节, h 代表高字节, 例如 :%h 输出部分 输出部分描述输出操作数, 不同的操作数描述符之间用逗号格开, 每个操作数描述符由限定字符串和 C 语言变量组成 每个输出操作数的限定字符串必须包含 = 表示他是一个输出操作数 例 : asm volatile ("pushfl ; popl %0 ; cli":"=g" (x) ) 描述符字符串表示对该变量的限制条件, 这样 GCC 就可以根据这些条件决定如何分配寄 存器, 如何产生必要的代码处理指令操作数与 C 表达式或 C 变量之间的联系

8 2.3.3 输入部分 输入部分描述输入操作数, 不同的操作数描述符之间使用逗号格开, 每个操作数描述符由限定字符串和 C 语言表达式或者 C 语言变量组成 例 1 : asm volatile ("lidt %0" : : "m" (real_mode_idt)); 例二 (bitops.h): Static inline void set_bit(int nr, volatile void * addr) { asm ( "btsl %1,%0" :"=m" (ADDR) :"Ir" (nr)); } 后例功能是将 (*addr) 的第 nr 位设为 1 第一个占位符%0 与 C 语言变量 ADDR 对应, 第二个占位符 %1 与 C 语言变量 nr 对应 因此上面的汇编语句代码与下面的伪代码等价 :btsl nr, ADDR, 该指令的两个操作数不能全是内存变量, 因此将 nr 的限定字符串指定为 Ir, 将 nr 与立即数或者寄存器相关联, 这样两个操作数中只有 ADDR 为内存变量 限制字符 限制字符列表 限制字符有很多种, 有些是与特定体系结构相关, 此处仅列出常用的限定字符和 i386 中可能用到的一些常用的限定符 它们的作用是指示编译器如何处理其后的 C 语言变量与指 令操作数之间的关系, 例如是将变量放在寄存器中还是放在内存中等, 下表列出了常用的限 定字母 分类 限定符 描述 通用寄存器 a 将输入变量放入 eax 这里有一个问题 : 假设 eax 已经被使用, 那怎么办? 其实很简单 : 因为 GCC 知道 eax 已经被使用, 它在这段汇编代码的起始处插入一条语句 pushl %eax, 将 eax 内容保存到堆栈, 然后在这段代码结束处再增加一条语句 popl %eax, 恢复 eax 的内容 b 将输入变量放入 ebx c 将输入变量放入 ecx d 将输入变量放入 edx s 将输入变量放入 esi d 将输入变量放入 edi

9 q 将输入变量放入 eax,ebx,ecx,edx 中的一个 r 将输入变量放入通用寄存器, 也就是 eax,ebx,ecx,edx,esi, edi 中的一个 A 把 eax 和 edx 合成一个 64 位的寄存器 (use long longs) 内存 m 内存变量 o 操作数为内存变量, 但是其寻址方式是偏移量类型, 也即是基址寻址, 或者是基址加变址寻址 V 操作数为内存变量, 但寻址方式不是偏移量类型 操作数为内存变量, 但寻址方式为自动增量 p 操作数是一个合法的内存地址 ( 指针 ) 寄存器或 g 将输入变量放入 eax,ebx,ecx,edx 中的一个或者作为内存变量 内存 X 操作数可以是任何类型 立即数 I 0-31 之间的立即数 ( 用于 32 位移位指令 ) J 0-63 之间的立即数 ( 用于 64 位移位指令 ) N 之间的立即数 ( 用于 out 指令 ) i 立即数 n 立即数, 有些系统不支持除字以外的立即数, 这些系统应该使用 n 而不是 i 匹配 0, 表示用它限制的操作数与某个指定的操作数匹配, 也即该操作数 1... 就是指定的那个操作数, 例如用 0 去描述 %1 操作数, 那 9 么 %1 引用的其实就是 %0 操作数, 注意作为限定符字母的 0-9 与指令中的 %0 - %9 的区别, 前者描述操作数, 后者 代表操作数 & 后面有详细描述 该输出操作数不能使用过和输入操作数相同的寄存器 后面有详细描述 操作数类 = 操作数在指令中是只写的 ( 输出操作数 ) 型 + 操作数在指令中是读写类型的 ( 输入输出操作数 ) 浮点数 f 浮点寄存器 t 第一个浮点寄存器 u 第二个浮点寄存器 G 标准的 浮点常数 % 该操作数可以和下一个操作数交换位置例如 addl 的两个操作数可以交换顺序 ( 当然两个操作数都不能是立即数 ) # 部分注释, 从该字符到其后的逗号之间所有字母被忽略 * 表示如果选用寄存器, 则其后的字母被忽略 现在继续看上面的例子,"=m" (ADDR) 表示 ADDR 为内存变量 ( m ), 而且是输出变量 ( = ); "Ir" (nr) 表示 nr 为 0-31 之间的立即数 ( I ) 或者一个寄存器操作数 ( r )

10 匹配限制符 I386 指令集中许多指令的操作数是读写型的 ( 读写型操作数指先读取原来的值然后参加运算, 最后将结果写回操作数 ), 例如 addl %1,%0, 它的作用是将操作数 %0 与操作数 %1 的和存入操作数 %0, 因此操作数 %0 是读写型操作数 老版本的 GCC 对这种类型操作数的支持不是很好, 它将操作数严格分为输入和输出两种, 分别放在输入部分和输出部分, 而没有一个单独部分描述读写型操作数, 因此在 GCC 中读写型的操作数需要在输入和输出部分分别描述, 靠匹配限制符将两者关联到一起 注意仅在输入和输出部分使用相同的 C 变量, 但是不用匹配限制符, 产生的代码很可能不对, 后面会分析原因 匹配限制符是一位数字 : 0 1 9, 分别表示它限制的 C 表达式分别与占位 符 %0,%1 %9 对应的 C 变量匹配 例如使用 0 作为 %1 的限制字符, 那么 %0 和 %1 表示 同一个 C 变量 看一下下面的代码就知道为什么要将读写型操作数, 分别在输入和输出部分加以描述 该例功能是求 input+result 的和, 然后存入 result: extern int input,result; void test_at_t() { result = 0; input = 1; asm volatile ("addl %1,%0":"=r"(result): "r"(input)); } 对应的汇编代码为 : movl $0,_result movl $1,_input movl _input,%edx /APP addl %edx,%eax /NO_APP movl %eax,%edx movl %edx,_result input 为输入型变量, 而且需要放在寄存器中,GCC 给它分配的寄存器是 %edx, 在执行 addl 之前 %edx 的内容已经是 input 的值 可见对于使用 r 限制的输入型变量或者表达式, 在使用之前 GCC 会插入必要的代码将他们的值读到寄存器 ; m 型变量则不需要这一步 读入 input 后执行 addl, 显然 %eax 的值不对, 需要先读入 result 的值才行 再往后看 :movl %eax,%edx 和 movl %edx,_result 的作用是将结果存回 result, 分配给 result 的寄存器与分配给 input 的一样, 都是 %edx

11 综上可以总结出如下几点 : 1. 使用 r 限制的输入变量,GCC 先分配一个寄存器, 然后将值读入寄存器, 最后用该寄存器替换占位符 ; 2. 使用 r 限制的输出变量,GCC 会分配一个寄存器, 然后用该寄存器替换占位符, 但是在使用该寄存器之前并不将变量值先读入寄存器,GCC 认为所有输出变量以前的值都没有用处, 不读入寄存器 ( 可能是因为 AT&T 汇编源于 CISC 架构处理器的汇编语言, 在 CISC 处理器中大部分指令的输入输出明显分开, 而不像 RISC 那样一个操作数既做输入又做输出, 例如 add r0,r1,r2,r0 和 r1 是输入,r2 是输出, 输入和输出分开, 没有使用输入输出型操作数, 这样我们就可以认为 r2 对应的操作数原来的值没有用处, 也就没有必要先将操作数的值读入 r2, 因为这是浪费处理器的 CPU 周期 ), 最后 GCC 插入代码, 将寄存器的值写回变量 ; 3. 输入变量使用的寄存器在最后一处使用它的指令之后, 就可以挪做其他用处, 因为已经不再使用 例如上例中的 %edx 在执行完 addl 之后就作为与 result 对应的寄存器 因为第二条, 上面的内嵌汇编指令不能奏效, 因此需要在执行 addl 之前把 result 的值读入寄存器, 也许再将 result 放入输入部分就可以了 ( 因为第一条会保证将 result 先读入寄存器 ) 修改后的指令如下( 为了更容易说明问题将 input 限制符由 r 改为 m ): extern int input,result; void test_at_t() { result = 0; input = 1; asm volatile ("addl %2,%0":"=r"(result):"r"(result),"m"(input)); } 看上去上面的代码可以正常工作, 因为我们知道 %0 和 %1 都和 result 相关, 应该使用同一个寄存器, 但是 GCC 并不去判断 %0 和 %1 是否和同一个 C 表达式或变量相关联 ( 这样易于产生与内嵌汇编相应的汇编代码 ), 因此 %0 和 %1 使用的寄存器可能不同 我们看一下汇编代码就知道了 movl $0,_result movl $1,_input movl _result,%edx /APP addl _input,%eax /NO_APP movl %eax,%edx movl %edx,_result 现在在执行 addl 之前将 result 的值被读入了寄存器 %edx, 但是 addl 指令的操作数 %0 却成了 %eax, 而不是 %edx, 与预料的不同, 这是因为 GCC 给输出和输入部分的变量分配了不

12 同的寄存器,GCC 没有去判断两者是否都与 result 相关, 后面会讲 GCC 如何翻译内嵌汇编, 看完之后就不会惊奇啦 使用匹配限制符后,GCC 知道应将对应的操作数放在同一个位置 ( 同一个寄存器或者同 一个内存变量 ) 使用匹配限制字符的代码如下 : extern int input,result; void test_at_t() { result = 0; input = 1; asm volatile ("addl %2,%0":"=r"(result):"0"(result),"m"(input)); } 输入部分中的 result 用匹配限制符 0 限制, 表示 %1 与 %0 代表同一个变量, 输入部 分说明该变量的输入功能, 输出部分说明该变量的输出功能, 两者结合表示 result 是读写 型 因为 %0 和 %1 表示同一个 C 变量, 所以放在相同的位置, 无论是寄存器还是内存 相应的汇编代码为 : movl $0,_result movl $1,_input movl _result,%edx movl %edx,%eax /APP addl _input,%eax /NO_APP movl %eax,%edx movl %edx,_result 可以看到与 result 相关的寄存器是 %edx, 在执行指令 addl 之前先从 %edx 将 result 读入 %eax, 执行之后需要将结果从 %eax 读入 %edx, 最后存入 result 中 这里我们可以看出 GCC 处理内嵌汇编中输出操作数的一点点信息 :addl 并没有使用 %edx, 可见它不是简单的用 result 对应的寄存器 %edx 去替换 %0, 而是先分配一个寄存器, 执行运算, 最后才将运算结果存入对应的变量, 因此 GCC 是先看该占位符对应的变量的限制符, 发现是一个输出型寄存器变量, 就为它分配一个寄存器, 此时没有去管对应的 C 变量, 最后 GCC 知道还要将寄存器的值写回变量, 与此同时, 它发现该变量与 %edx 关联, 因此先存入 %edx, 再存入变量 至此读者应该明白了匹配限制符的意义和用法 在新版本的 GCC 中增加了一个限制字符 +, 它表示操作数是读写型的,GCC 知道应将变量值先读入寄存器, 然后计算, 最后写回变量, 而无需在输入部分再去描述该变量 例 ; extern int input,result;

13 void test_at_t() { result = 0; input = 1; asm volatile ("addl %1,%0":"+r"(result):"m"(input)); } 此处用 + 替换了 =, 而且去掉了输入部分关于 result 的描述, 产生的汇编代码如下 : movl $0,_result movl $1,_input movl _result,%eax /APP addl _input,%eax /NO_APP movl %eax,_result L2: movl %ebp,%esp 处理的比使用匹配限制符的情况还要好, 省去了好几条汇编代码 & 限制符 限制符 & 在内核中使用的比较多, 它表示输入和输出操作数不能使用相同的寄存器, 这样可以避免很多错误 举一个例子, 下面代码的作用是将函数 foo 的返回值存入变量 ret 中 : asm ( call foo;movl %%edx,%1, : =a (ret) : r (bar) ); 我们知道函数的 int 型返回值存放在 %eax 中, 但是 gcc 编译的结果是输入和输出同时使用了寄存器 %eax, 如下 : movl bar, %eax #APP call foo movl %ebx,%eax #NO_APP movl %eax, ret 结果显然不对, 原因是 GCC 并不知道 %eax 中的值是我们所要的 避免这种情况的方法 是使用 & 限定符, 这样 bar 就不会再使用 %eax 寄存器, 因为已被 ret 指定使用 _asm ( call foo;movl %%edx,%1, : =&a (ret) : r (bar) );

14 2.3.5 破坏描述部分 寄存器破坏描述符 通常编写程序只使用一种语言 : 高级语言或者汇编语言 高级语言编译的步骤大致如下 : 预处理 ; 编译 汇编 链接我们这里只关心第二步编译 ( 将 C 代码转换成汇编代码 ): 因为所有的代码都是用高级语言编写, 编译器可以识别各种语句的作用, 在转换的过程中所有的寄存器都由编译器决定如何分配使用, 它有能力保证寄存器的使用不会冲突 ; 也可以利用寄存器作为变量的缓冲区, 因为寄存器的访问速度比内存快很多倍 如果全部使用汇编语言则由程序员去控制寄存器的使用, 只能靠程序员去保证寄存器使用的正确性 但是如果两种语言混用情况就变复杂了, 因为内嵌的汇编代码可以直接使用寄存器, 而编译器在转换的时候并不去检查内嵌的汇编代码使用了哪些寄存器 ( 因为很难检测汇编指令使用了哪些寄存器, 例如有些指令隐式修改寄存器, 有时内嵌的汇编代码会调用其他子过程, 而子过程也会修改寄存器 ), 因此需要一种机制通知编译器我们使用了哪些寄存器 ( 程序员自己知道内嵌汇编代码中使用了哪些寄存器 ), 否则对这些寄存器的使用就有可能导致错误, 修改描述部分可以起到这种作用 当然内嵌汇编的输入输出部分指明的寄存器或者指定为 r, g 型由编译器去分配的寄存器就不需要在破坏描述部分去描述, 因为编译器已经知道了 破坏描述符由逗号格开的字符串组成, 每个字符串描述一种情况, 一般是寄存器名 ; 除 寄存器外还有 memory 例如 : %eax, %ebx, memory 等 下面看个例子就很清楚为什么需要通知 GCC 内嵌汇编代码中隐式 ( 称它为隐式是因为 GCC 并不知道 ) 使用的寄存器 在内嵌的汇编指令中可能会直接引用某些寄存器, 我们已经知道 AT&T 格式的汇编语言中, 寄存器名以 % 作为前缀, 为了在生成的汇编程序中保留这个 % 号, 在 asm 语句中对寄存器的引用必须用 %% 作为寄存器名称的前缀 原因是 % 在 asm 内嵌汇编语句中的作用与 \ 在 C 语言中的作用相同, 因此 %% 转换后代表 % 例 ( 没有使用修改描述符 ): int main(void) { int input, output,temp; input = 1; asm volatile ("movl $0, %%eax;\n\t movl %%eax, %1;\n\t

15 } return 0; movl %2, %%eax;\n\t movl %%eax, %0;\n\t" :"=m"(output),"=m"(temp) /* output */ :"r"(input) /* input */ ); 这段代码使用 %eax 作为临时寄存器, 功能相当于 C 代码 : temp = 0;output=input, 对应的汇编代码如下 : movl $1,-4(%ebp) movl -4(%ebp),%eax /APP movl $0, %eax; movl %eax, -12(%ebp); movl %eax, %eax; movl %eax, -8(%ebp); /NO_APP input 显然 GCC 给 input 分配的寄存器也是 %eax, 发生了冲突,output 的值始终为 0, 而不是 使用破坏描述后的代码 : int main(void) { int input, output,temp; } input = 1; asm volatile ("movl $0, %%eax;\n\t movl %%eax, %1;\n\t movl %2, %%eax;\n\t movl %%eax, %0;\n\t" :"=m"(output),"=m"(temp) /* output */ :"r"(input) /* input */ :"eax"); /* 描述符 */ return 0; 对应的汇编代码 : movl $1,-4(%ebp) movl -4(%ebp),%edx /APP

16 movl $0, %eax; movl %eax, -12(%ebp); movl %edx, %eax; movl %eax, -8(%ebp); /NO_APP 通过破坏描述部分,GCC 得知 %eax 已被使用, 因此给 input 分配了 %edx 在使用内嵌汇 编时请记住一点 : 尽量告诉 GCC 尽可能多的信息, 以防出错 如果你使用的指令会改变 CPU 的条件寄存器 cc, 需要在修改描述部分增加 cc memory 破坏描述符 memory 比较特殊, 可能是内嵌汇编中最难懂部分 为解释清楚它, 先介绍一下编译 器的优化知识, 再看 C 关键字 volatile 最后去看该描述符 编译器优化介绍 内存访问速度远不及 CPU 处理速度, 为提高机器整体性能, 在硬件上引入硬件高速缓存 Cache, 加速对内存的访问 另外在现代 CPU 中指令的执行并不一定严格按照顺序执行, 没有相关性的指令可以乱序执行, 以充分利用 CPU 的指令流水线, 提高执行速度 以上是硬件级别的优化 再看软件一级的优化 : 一种是在编写代码时由程序员优化, 另一种是由编译器进行优化 编译器优化常用的方法有 : 将内存变量缓存到寄存器 ; 调整指令顺序充分利用 CPU 指令流水线, 常见的是重新排序读写指令 对常规内存进行优化的时候, 这些优化是透明的, 而且效率很好 由编译器优化或者硬件重新排序引起的问题的解决办法是在从硬件 ( 或者其他处理器 ) 的角度看必须以特定顺序执行的操作之间设置内存屏障 (memory barrier),linux 提供了一个宏解决编译器的执行顺序问题 void Barrier(void) 这个函数通知编译器插入一个内存屏障, 但对硬件无效, 编译后的代码会把当前 CPU 寄存器中的所有修改过的数值存入内存, 需要这些数据的时候再重新从内存中读出 C 语言关键字 volatile C 语言关键字 volatile( 注意它是用来修饰变量而不是上面介绍的 volatile ) 表明某个变量的值可能在外部被改变, 因此对这些变量的存取不能缓存到寄存器, 每次使用时需要重新存取 该关键字在多线程环境下经常使用, 因为在编写多线程的程序时, 同一个变量可能被多个线程修改, 而程序通过该变量同步各个线程, 例如 :

17 DWORD stdcall threadfunc(lpvoid signal) { int* intsignal=reinterpret_cast<int*>(signal); *intsignal=2; while(*intsignal!=1) sleep(1000); return 0; } 该线程启动时将 intsignal 置为 2, 然后循环等待直到 intsignal 为 1 时退出 显然 intsignal 的值必须在外部被改变, 否则该线程不会退出 但是实际运行的时候该线程却不会退出, 即使在外部将它的值改为 1, 看一下对应的伪汇编代码就明白了 : mov ax,signal label: if(ax!=1) goto label 对于 C 编译器来说, 它并不知道这个值会被其他线程修改 自然就把它 cache 在寄存器里面 记住,C 编译器是没有线程概念的! 这时候就需要用到 volatile volatile 的本意是指 : 这个值可能会在当前线程外部被改变 也就是说, 我们要在 threadfunc 中的 intsignal 前面加上 volatile 关键字, 这时候, 编译器知道该变量的值会在外部改变, 因此每次访问该变量时会重新读取, 所作的循环变为如下面伪码所示 : label: mov ax,signal if(ax!=1) goto label Memory 有了上面的知识就不难理解 Memory 修改描述符了,Memory 描述符告知 GCC: 1) 不要将该段内嵌汇编指令与前面的指令重新排序 ; 也就是在执行内嵌汇编代码之前, 它前面的指令都执行完毕 2) 不要将变量缓存到寄存器, 因为这段代码可能会用到内存变量, 而这些内存变量会以不可预知的方式发生改变, 因此 GCC 插入必要的代码先将缓存到寄存器的变量值写回内存, 如果后面又访问这些变量, 需要重新访问内存 如果汇编指令修改了内存, 但是 GCC 本身却察觉不到, 因为在输出部分没有描述, 此时就需要在修改描述部分增加 memory, 告诉 GCC 内存已经被修改,GCC 得知这个信息后, 就会在这段指令之前, 插入必要的指令将前面因为优化 Cache 到寄存器中的变量值先写回内存, 如果以后又要使用这些变量再重新读取 例 :..

18 Char test[100]; char a; char c; c = 0; test[0] = 1;.. a = test [0]; asm ("cld\n\t" "rep\n\t" "stosb" : /* no output */ : "a" (c),"d" (test),"c" (100) : "cx","di","memory");. // 我们知道 test[0] 已经修改, 所以重新读取 a=test[0]; 这段代码中的汇编指令功能与 memset 相当, 也就是相当于调用了 memset(test,0,100); 它使用 stosb 修改了 test 数组的内容, 但是没有在输入或输出部分去描述操作数, 因为这两条指令都不需要显式的指定操作数, 因此需要增加 memory 通知 GCC 现在假设:GCC 在优化时将 test[0] 放到了 %eax 寄存器, 那么 test[0] = 1 对应于 %eax=1,a = test [0] 被换为 a=%eax, 如果在那段汇编指令中不使用 memory,gcc 不知道现在 test[0] 的值已经被改变了 ( 如果整段代码都是我们自己使用汇编编写, 我们自己当然知道这些内存的修改情况, 我们也可以人为的去优化, 但是现在除了我们编写的那一小段外, 其他汇编代码都是 GCC 生成的, 它并没有那么智能, 知道这段代码会修改 test[0]), 结果其后的 a=test[0], 转换为汇编后却是 a=%eax, 因为 GCC 不知道显式的改变了 test 数组, 结果出错了 如果增加了 memory 修饰符,GCC 知道 : 这段代码修改了内存, 但是也仅此而已, 它并不知道到底修改了哪些变量, 因此他将以前因优化而缓存到寄存器的变量值全部写回内存, 从内嵌汇编开始, 如果后面的代码又要存取这些变量, 则重新存取内存 ( 不会将读写操作映射到以前缓存的那个寄存器 ) 这样上面那段代码最后一句就不再是%eax=1, 而是 test[0] = 1 这两条对实现临界区至关重要, 第一条保证不会因为指令的重新排序将临界区内的代码调到临界区之外 ( 如果临界区内的指令被重排序放到临界区之外,What will happen?), 第二条保证在临界区访问的变量的值, 肯定是最新的值, 而不是缓存在寄存器中的值, 否则就会导致奇怪的错误 例如下面的代码 : int del_timer(struct timer_list * timer) { int ret = 0; if (timer->next) {

19 } unsigned long flags; struct timer_list * next; save_flags(flags); cli(); // 临界区开始 if ((next = timer->next)!= NULL) { (next->prev = timer->prev)->next = next; timer->next = timer->prev = NULL; ret = 1; } // 临界区结束 restore_flags(flags); } return ret; 它先判断 timer->next 的值, 如果是空直接返回, 无需进行下面的操作 如果不是空, 则进入临界区进行操作, 但是 cli() 的实现 ( 见下面 ) 没有使用 memory,timer->next 的值可能会被缓存到寄存器中, 后面 if ((next = timer->next)!= NULL) 会从寄存器中读取 timer->next 的值, 如果在 if (timer->next) 之后, 进入临界区之前,timer->next 的值可能被在外部改变, 这时肯定会出现异常情况, 而且这种情况很难 Debug 但是如果 cli 使用 memory, 那么 if ((next =timer->next)!= NULL) 语句会重新从内存读取 timer->next 的值, 而不会从寄存器中取, 这样就不会出现问题啦 2.4 版内核中 cli 和 sti 的代码如下 : #define cli() asm volatile ("cli": : :"memory") #define sti() asm volatile ("sti": : :"memory") 通过上面的例子, 读者应该知道, 为什么指令没有修改内存, 但是却使用 memory 修 改描述符的原因了吧 应从指令的上下文去理解为什么要这样做 使用 volatile 也可以达到这个目的, 但是我们在每个变量前增加该关键字, 不如使 用 memory 方便 2.4 GCC 如何编译内嵌汇编代码 GCC 编译内嵌汇编代码的步骤如下 : 1. 输入变量与占位符根据限定符和破坏描述部分, 为输入和输出部分的变量分配合适的寄存器, 如果限定符指定为立即数 ( i ) 或内存变量 ( m ) 则不需要该步骤, 如果限定符没有具体指定输入操作数的类型 ( 如 g ),GCC 会视需要决定是否将该操作数输入到某个寄存器 这样每个占位符都与某个寄存器 内存变量或立即数形成了一一对应的关系 对分配了寄存器的输入变量需要增加代码将它的值读入寄存器 另外还要根据破坏描述符的部分增加额外代码

20 2. 指令模板部分 然后根据这种一一对应的关系, 用这些寄存器 内存变量或立即数来取代汇编代码中的 占位符 3. 变量输出 按照输出限定符的指定将寄存器的内容输出到某个内存变量中, 如果输出操作数的限定 符指定为内存变量 ( m ), 则该步骤被省略 3 后记 该文档参照了 Web 上的许多与 GCC 内嵌汇编相关的文章编写而成, 在此表示感谢, 如有 问题请发 至 :chforest_chang@hotmail.com 一起讨论

<4D F736F F D20B5DAB6FED5C2A3AE BBE3B1E0D3EFD1D4D3EB474343C4DAC7B6BBE3B1E02E646F63>

<4D F736F F D20B5DAB6FED5C2A3AE BBE3B1E0D3EFD1D4D3EB474343C4DAC7B6BBE3B1E02E646F63> 第二章.AT&T 汇编语言与 GCC 内嵌汇编 (v0.1) 说到 AT&T 汇编语言, 我们就需要从 Unix 开始说起 Unix 最初是为 PDP-11 开发的, 曾先后被移植到 VAX 及 68000 系列的处理器上, 这些处理器上的汇编语言都采用的是 AT&T 的指令格式 ( 那个时候,Intel 公司还未成立, 而 AT&T 公司尚未被拆分 ) 作为 Unix 家族的一员, 我们今天使用的

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx 第五讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 4 章寻址方式与指令系统 1 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 2 指令的组成 指令由操作码和操作数两部分组成 操作码操作数 MOV AX, 8726H ADD AX,

More information

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 第 3 章 8086 的寻址方式和指令系统 (1) 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 1 主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 3.1 8086 的寻址方式 两种不同的类型 : 一类是程序地址 ( 在代码段中 ) 的寻址方式 ; 另一类是操作数地址的寻址方式

More information

<4D F736F F D204C696E757820BBE3B1E0D3EFD1D4BFAAB7A2D6B8C4CF2E646F63>

<4D F736F F D204C696E757820BBE3B1E0D3EFD1D4BFAAB7A2D6B8C4CF2E646F63> Linux 汇编语言开发指南 肖文鹏 (xiaowp@263.net) 北京理工大学计算机系硕士研究生 2003 年 7 月 汇编语言的优点是速度快, 可以直接对硬件进行操作, 这对诸如图形处理等关键应用是非常重要的 Linux 是一个用 C 语言开发的操作系统, 这使得很多程序员开始忘记在 Linux 中还可以直接使用汇编这一底层语言来优化程序的性能 本文为那些在 Linux 平台上编写汇编代码的程序员提供指南,

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

1 CPU interrupt INT trap CPU exception

1 CPU interrupt INT trap CPU exception 1 CPU interrupt INT trap CPU exception 2 X86 CPU gate 64 16 1 2 5 8 16 16 P DPL 00101 TSS 101 DPL P 1 64 16 1 2 1 1 3 3 5 16 16 16 P DPL 0 D 000 16 110 111 100 D 1=32 0=16 DPL P 1 INT DPL1>=CPL>=DPL CPU

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E ===================== 吾爱破解论坛 [LCG] [LSG] 立足软件安全和病毒分析最前端, 丰富的技术版块交相辉映, 由无数加密解密及反病毒爱好者共同维护, 留给世界一抹值得百年回眸的惊 艳, 沉淀百年来计算机应用之精华与优雅, 信息线条与生活质感淡定交融, 任岁月流转, 低调而奢华的技术交流与研究却是亘古不变 标题 : 一个感染样本的简单分析 作者 :ximo 今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单,

More information

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63> 1 实验目的 实验 2 C 和汇编语言的混合编程实验 学习在 C 程序中使用嵌入式汇编编写程序 了解嵌入式汇编的格式 语言特点 2 实验设备 S3C2410 开发板 ADS1.2 集成开发环境,JTAG 调试器 串口连接线 3 实验原理 在 ARM 的应用开发中,C 语言功能强大且容易编写程序, 但是汇编程序在底层的操作仍然具有 C 程序无法替代的功能, 有时候我们需要在 C 程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作

More information

程序 14-9 linux/include/string.h 1 #ifndef _STRING_H_ 2 #define _STRING_H_ 3 4 #ifndef NULL 5 #define NULL ((void *) 0) 6 #endif 7 8 #ifndef _SIZE_T 9 #

程序 14-9 linux/include/string.h 1 #ifndef _STRING_H_ 2 #define _STRING_H_ 3 4 #ifndef NULL 5 #define NULL ((void *) 0) 6 #endif 7 8 #ifndef _SIZE_T 9 # 程序 14-9 linux/include/string.h 1 #ifndef _STRING_H_ 2 #define _STRING_H_ 3 4 #ifndef NULL 5 #define NULL ((void *) 0) 6 #endif 7 8 #ifndef _SIZE_T 9 #define _SIZE_T 10 typedef unsigned int size_t; 11 #endif

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

Linux kernel exploit研究和探索

Linux kernel exploit研究和探索 Linux kernel exploit DOC alert7 PPT e4gle 2002-12-2 1 2002-12-2 2 Linux kernel exploit kernel exploit exploit exploit exploit (Kernel Buffer Overflow) (Kernel

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc 2 5 8 11 0 1. 13 2. 15 3. 18 1 1. 22 2. 25 3. 27 2 1. 35 2. 38 3. 41 4. 43 5. 48 6. 50 3 1. 56 2. 59 3. 63 4. 65 5. 69 13 22 35 56 6. 74 7. 82 8. 84 9. 87 10. 97 11. 102 12. 107 13. 111 4 114 1. 114 2.

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched.

Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched. Linux Kernel 2.6 20321131 Kernel 2.4...3 Kernel 2.4...3 Kernel 2.4...3 Kernel 2.6...3...3 1....3 2....4 3. load estimator...4 4....4 5....4...4 1....4 2. runqueue kernel/sched.c...4 3. task_struct(include/linux/sched.h)...6...9

More information

数据库系统概论

数据库系统概论 所谓寻址方式, 就是指令中用于说明操 作数所在地或者所在地地址的方法 8088/8086 的寻址方式分为两类 : 关于寻找数据的寻址方式 关于寻找转移地址的寻址方式 下面讲关于数据的寻址方式时, 均以数 据传送指令 MOV 为例讲解 MOV 指令格式如下 : MOV DST, SRC 助记符 目的操作数 指令完成的功能 : (DST) 源操作数 (SRC) 一. 关于寻找数据的寻址方式 ( 共 8

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

ROP_bamboofox.key

ROP_bamboofox.key ROP Return Oriented Programming Lays @ BambooFox Who Am I Lays / L4ys / 累死 - l4ys.tw Reverse Engineering BambooFox / HITCON Outline Buffer Overflow ret2libc / ret2text Return Oriented Programming Payload

More information

CH559指令周期.doc

CH559指令周期.doc CH55X 汇编指令周期表 CH55X 汇编指令概述 : 型号包含 : a. 指令单周期型号 :CH557 CH558 CH559; b. 指令 4 周期型号 :CH551 CH552 CH553 CH554; c. 非跳转指令的指令周期数与指令字节数相同 ; d. 跳转指令含 MOVC/RET/CALL 通常比字节数多若干个周期 ; e.movc 指令多 4 或 5 个周期 ( 下条指令地址为奇数时多

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

第3章、嵌入式Linux C语言高级用法

第3章、嵌入式Linux C语言高级用法 在上在本中, 读者将会学习嵌入式 Linux C 语言的高级用法, 这些在使用嵌入式 Linux C 开发的应用程序中是比较常见的 另外, 本也会讲解一些有关嵌入式 Linux C 程序可移植性问题 C 语言与汇编语言之间的混合编程 本主要内容 q 预处理 q C 语言中的内存分配 q 程序的可移植性考虑 嵌入式 Linux C 语言高级用法 q C 和汇编的接口 预处理 在本书的 2 中, 已介绍过编译过程中的预处理阶段

More information

为 了 衡 量 一 个 算 法 时 间 效 率 上 的 优 劣, 计 算 机 科 学 中 引 入 了 时 间 复 杂 度 的 概 念 回 忆 我 们 习 惯 使 用 的 大 O 表 示 法, 我 们 说 一 个 算 法 运 行 时 间 的 界 是 O(f(n)), 所 表 示 的 意 义 是, 假

为 了 衡 量 一 个 算 法 时 间 效 率 上 的 优 劣, 计 算 机 科 学 中 引 入 了 时 间 复 杂 度 的 概 念 回 忆 我 们 习 惯 使 用 的 大 O 表 示 法, 我 们 说 一 个 算 法 运 行 时 间 的 界 是 O(f(n)), 所 表 示 的 意 义 是, 假 论 程 序 底 层 优 化 的 一 些 方 法 与 技 巧 成 都 七 中 骆 可 强 摘 要 : 本 文 以 优 化 程 序 运 行 的 时 间 效 率 为 目 地, 从 编 译 器 汇 编 代 码 CPU 特 性 等 较 为 底 层 的 概 念 着 眼, 对 程 序 优 化 进 行 了 全 方 位 的 探 讨, 总 结 了 在 优 化 中 实 用 的 思 想 原 则 方 法 和 技 巧, 并 对

More information

微机原理(计算机原理与接口技术)

微机原理(计算机原理与接口技术) 微机原理 ( 计算机原理 ) 第 10 讲 MIPS 体系结构与编程 1 第 10 讲 MIPS 体系结构与编程 MIPS 体系结构概述 MIPS 指令集简介 MIPS 汇编语言程序设计 2 MIPS 体系结构概述 MIPS 诞生于 1980 年代, 是最早的 RISC 处理器之一, 也是目前销量最好的 RISC 处理器之一, 从游戏机到路由器, 再到 SGI 的超级计算机, 都可以看到 MIPS

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式]

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式] 本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16.

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

<4D F736F F D20CEC4BCFEBCB6B6F1D2E2B4FAC2EBC9A8C3E8D2FDC7E6D6D0B5C4BCD3BFC7CAB6B1F0BCBCCAF52E646F6378>

<4D F736F F D20CEC4BCFEBCB6B6F1D2E2B4FAC2EBC9A8C3E8D2FDC7E6D6D0B5C4BCD3BFC7CAB6B1F0BCBCCAF52E646F6378> 文件级恶意代码扫描引擎中的加壳识别技术 安天实验室 Swordlea 2003 年 12 月 25 日 在文件级恶意代码扫描引擎的设计与实现过程中, 加壳后样本的特征选取和识别是较为棘手的问题 恶意代码的制作者为了使其作品传播更广, 往往使用软件加壳的方式 样本被加壳以后, 其原有特征码被变形或彻底隐藏, 在一定程度中增加了样本分析与识别的难度 目前反病毒公司在对加壳后样本的处理上一般采用以下几种方式

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

第四章 8086汇编语言程序设计

第四章 8086汇编语言程序设计 第四章汇编语言程序设计 几个概念 8086 汇编语言的语句 8086 汇编中的伪指令 8086 汇编中的运算符 汇编语言程序设计 系统调用 几个概念 1. 汇编语言 2. 汇编语言源程序 3. 汇编 4. 汇编程序 5. 什么是汇编语言 (Assembly Language)? 6. 使用指令的助记符 符号地址和标号等编写的程序设计语言 7. 每条指令都有对应的机器码, 不同的 CPU 使用不同的汇编语言

More information

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de 程序 14-24 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #define _LINUX_MATH_EMU_H 8 9 #include

More information

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt MINIX ( 730000) ( 730000) MINIX MINIX2.0 MINIX : MINIX TP3 1 MINIX UNIX Tanenbaum UNIX MINIX LINUX MINIX MINIX MINIX1.0 UNIX V7 MINIX2.0[3] POSIX MINIX3 MINIX Gabriel A. Wainer 1994-1995 [5] 1998 I/O 2002

More information

7 Q&A 11 2

7 Q&A 11 2 PPCA2018: 带五级流 的 MIPS 模拟器 PPCA 助教组 2018.7 目录 1 概述 3 2 时间和要求 3 3 正确性 3 3.1 初始化..................................... 3 3.2 寄存器..................................... 3 3.2.1 通 寄存器..............................

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

格式化字符串 Weifeng Sun School of Software, DLUT

格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串漏洞 格式化字符串, 也是一种比较常见的漏洞类型 会触发该漏洞的函数很有限 主要就是 printf 还有 sprintf,fprintf 等等 c 库中 print 家族的函数 >int printf(const char* format,...) 2 / 42 3 / 42 A B 字符串指针 char

More information

Andes Technology PPT Temp

Andes Technology PPT Temp 晶心科技線上技術研討會 AndesCore 便捷的全 C 嵌入式编程 晶心科技市場及技術服務部毛礼杰軟件經理 WWW.ANDESTECH.COM 大纲 系统初始化介绍 异常和中断说明 全 C 语法例子说明 总结 2 CPU 相关特性 1: 中断向量表 系统初始化 (1) 2: 系统寄存器 通常需要用 assembly( 汇编 / 组合 ) 语言来操作 AndesCore 全 C 嵌入式编程 C 扩展语法

More information

instructions.PDF

instructions.PDF 94 SIMATIC (END) (END) Micro/WIN 32 (STOP) (STOP) CPU RUN STOP STOP CPU RUN STOP (WDR) (Watchdog Reset) (WDR) CPU WDR WDR ( ) I/O ( I/O ) SM (SM0 SM5 SM29 ) 25 0 ms 00 ms STOP 300ms 300ms WDR S7-200 CPU

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i

修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i 2013.12.8 7.4 修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 2013.12.1 6.12 下面是一个 C 语言程序 : long f1( i ) long i; { return(i 10); long f2(long i) { return(i

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式]

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式] 本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16.

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un Linux C July 27, 2016 Contents 1 Linux IDE 1 2 GCC 3 2.1 hello.c hello.exe........................... 5 2.2............................... 9 2.2.1 -Wall................................ 9 2.2.2 -E..................................

More information

概述 基于 Cortex-M3 内核的 STM32F103 系列单片机, 并没有浮点运算协处理器 在 STM32F103 上进行的浮点运算都是软件模拟实现 考虑到加入浮点运算库需要大约 10K 左右的 FLASH 空间 ( 即 <math.h> 对应的数学库 ), 而且浮点运算速度较慢,EC30-E

概述 基于 Cortex-M3 内核的 STM32F103 系列单片机, 并没有浮点运算协处理器 在 STM32F103 上进行的浮点运算都是软件模拟实现 考虑到加入浮点运算库需要大约 10K 左右的 FLASH 空间 ( 即 <math.h> 对应的数学库 ), 而且浮点运算速度较慢,EC30-E 基于 EC30-EKSTM32 扩展浮点运算 CREATE: 2010/08/05 UPDATE: 2010/08/05 GUTTA Ladder Editor Version 1.1 Version 1.1 http://www.plcol.com http://www.visiblec.com 概述... 2 指令描述... 2 +R... 2 -R... 2 *R... 3 /R... 3 SQRT...

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

L15 MIPS Assembly

L15 MIPS Assembly Lecture 19: MIPS Assembly Language 程序的机器级表示主要内容 MIPS 指令格式 R- 类型 / I- 类型 / J- 类型 MIPS 寄存器 长度 / 个数 / 功能分配 MIPS 操作数 寄存器操作数 / 存储器操作数 / 立即数 / 文本 / 位 MIPS 指令寻址方式 立即数寻址 / 寄存器寻址 / 相对寻址 / 伪直接寻址 / 偏移寻址 MIPS 指令类型

More information

KV-cache 1 KV-cache Fig.1 WorkflowofKV-cache 2.2 Key-value Key ; Key Mem-cache (FIFO) Value Value Key Mem-cache ( Value 256B 100 MB 20%

KV-cache 1 KV-cache Fig.1 WorkflowofKV-cache 2.2 Key-value Key ; Key Mem-cache (FIFO) Value Value Key Mem-cache ( Value 256B 100 MB 20% 38 11 2013 11 GeomaticsandInformationScienceofWuhanUniversity Vol.38No.11 Nov.2013 :1671-8860(2013)11-1339-05 :A GIS Key-value 1 1 1 1 (1 129 430079) : 设计了一种基于 Key-value 结构的缓存 KV-cache 旨在简化数据结构 高效管理缓存数据

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 1 2 1 2 3 4 5 6 7 8 9 10 3 1 150 2 150 1 1 1.1 1.1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.4 1.4.1 CPU 1.4.2 I/O 1.4.3 I/O 1.5 1.5.1 CISC RISC 1.5.2 1.5.3 1.6 1.6.1 1.6.2 N 1.6.3 2 2.1 2.1.1 2.1.2 2.1.3

More information

第十章 数模转换与模数转换接口及其应用

第十章 数模转换与模数转换接口及其应用 第三章 80X86 指令系统 ( 补 ) 1 80x86 的寻址方式和指令系统 一 80x86 的寻址方式二 80x86 的指令系统三浮点运算指令简介四 MMX 技术简介 一 80x86 的寻址方式 (1) 直接寻址方式如 : INC WORD PTR [500] ; 字的有效地址为 500 (2) 寄存器间接寻址方式如 : MOV [ECX],EDX ;ECX 指出有效地址 一 80x86 的寻址方式

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

36 asm ("mov %%fs,%%ax":"=a" ( res):); \ 37 res;}) 38 // 以下定义了一些函数原型 39 void page_exception(void); // 页异常 实际是 page_fault(mm/page.s,14) void divi

36 asm (mov %%fs,%%ax:=a ( res):); \ 37 res;}) 38 // 以下定义了一些函数原型 39 void page_exception(void); // 页异常 实际是 page_fault(mm/page.s,14) void divi 程序 8-2 linux/kernel/traps.c 1 /* 2 * linux/kernel/traps.c 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 7 /* 8 * 'Traps.c' handles hardware traps and faults after we have saved some 9 * state in 'asm.s'. Currently

More information

Microsoft PowerPoint - Ch3-8086CPU指令系统(2)-寻址.pptx

Microsoft PowerPoint - Ch3-8086CPU指令系统(2)-寻址.pptx 2018 版 微机原理与系统设计 第 3 章 8086CPU 指令系统 董明皓, 博士 西安电子科技大学 dminghao@xidian.edu.cn 目录 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 2 目录 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 3 8086 指令分类

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

专题一.ppt

专题一.ppt Android 核心入门分析 Jack.fan Copyright 2007-2008 Farsight. All rights reserved. 主要内容 : } 1 android 系统启动流程分析 } 2 android 系统 JNI 和 Binder 使用简介 } 3 android 系统输入子系统模型分析 1.1 android 系统启动流程分析 : } 1). } init 进程启动控制台进程

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

前沿技术 全面绕过执行流保护 安全研究部张云海 执行流保护 (CFG,Control Flow Guard) 是微软在 Windows 10 技术预览版与 Windows 8.1 update 3 中, 默认启用的一项缓解技术 在分析 CFG 的实现机制的过程中, 我们发现了一种全面绕过 CFG 的

前沿技术 全面绕过执行流保护 安全研究部张云海 执行流保护 (CFG,Control Flow Guard) 是微软在 Windows 10 技术预览版与 Windows 8.1 update 3 中, 默认启用的一项缓解技术 在分析 CFG 的实现机制的过程中, 我们发现了一种全面绕过 CFG 的 全面绕过执行流保护 安全研究部张云海 执行流保护 (CFG,Control Flow Guard) 是微软在 Windows 10 技术预览版与 Windows 8.1 update 3 中, 默认启用的一项缓解技术 在分析 CFG 的实现机制的过程中, 我们发现了一种全面绕过 CFG 的方法, 并配合微软修复了这一问题 背景 FG 是微软在 Windows 10 技术预览 C版与 Windows

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

Microsoft PowerPoint sun-program2.ppt [Compatibility Mode]

Microsoft PowerPoint sun-program2.ppt [Compatibility Mode] 嵌入式系统设计与应用 第五章程序设计与分析 (2) 西安交通大学电信学院 孙宏滨 4 基本编译技术 编译 = 翻译 + 优化 翻译 : 将高级语言程序翻译成低级形式的指令 优化 : 与翻译过程中所使用的语句间相互独立的简单方法相比, 优化可以生成更高指令的代码 编译决定着代码质量 : 占用 CPU 资源 存储器访问调度 代码大小 2 基本编译过程 高级语言代码 语法分析 符号表生成和语义分析 独立于机器的优化

More information

PowerPoint Presentation

PowerPoint Presentation Skill-building Courses Intro to SQL Lesson 2 More Functions in SQL 通配符 :LIKE SELECT * FROM Products WHERE PName LIKE %gizmo% PName Price Category Manufacturer Gizmo $19.99 Gadgets GizmoWorks Powergizmo

More information

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/ 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:// 不能以数字开头 D._3_ B:// 不能用点和空格 提问 抢答 E.$anothervar C: // 不能用点和空格

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

untitled

untitled 1 5 IBM Intel 1. IBM 第 1/175 页 第 2/175 页 第 3/175 页 80 第 4/175 页 2. IBM 第 5/175 页 3. (1) 第 6/175 页 第 7/175 页 第 8/175 页 = = 第 9/175 页 = = = = = 第 10/175 页 = = = = = = = = 3. (2) 第 11/175 页 第 12/175 页 第 13/175

More information

Android 框架虚拟化实战 董福源 360 手机卫士 2017.thegiac.com

Android 框架虚拟化实战 董福源 360 手机卫士 2017.thegiac.com Android 框架虚拟化实战 董福源 360 手机卫士 什么是虚拟化 原生 apk 在封闭系统内 免安装运行 Android 系统的一种沙箱技术 技术架构 Sandbox apps Android OS 目录 Sandbox apps Android OS Activity 插件化 只能启动 Manifest 中声明的 activity 占坑方案 欺骗 AMS Activity 启动过程 ContentImpl

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 计算机系统基础 Programming Assignment PA 2 程序的执行 ( 第一课 ) PA 2-1 指令解码与执行 2017 年 9 月 22 日 前情提要 Monitor 调试命令 CPU 寄存器堆 GPRs EFLAGS ALU FPU 主存 NEMU PA 1 Pass ======== reg test ======== reg_test() pass ======== fpu

More information

第一章

第一章 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1500 1450 1400 1350 1300 1250 1200 15 16 17 18 19 20 21 22 23 24 25 26 27 28 INPUT2006 29 30 31 32 33 34 35 9000 8500 8000 7500 7000 6500 6000 5500 5000 4500 4000 3500

More information

DPJJX1.DOC

DPJJX1.DOC 8051 111 2K 1 2 3 ' ' 1 CPU RAM ROM / A/D D/A PC CPU 40 68 10 20 8 51 PIII 8051 2 MCS51 8051 8031 89C51 8051 8031 89C51? MCS51 INTEL INTEL 8031 8051 8751 8032 8052 8752 8051 8051 8051 MCS51 8031 8031

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

Microsoft Word - MAN2011A_CH_RTT.doc

Microsoft Word - MAN2011A_CH_RTT.doc 基于 SAM7X EK 和 IAR EWARM 文档编号 文档版本 Rev. A 文档摘要 基于 AT91SAM7X EK 开发板的代码解读,RTT 代码解读 关键词 AT91SAM7X256 SAM7X EK IAR EWARM J LINK RTT 创建日期 2010 06 08 创建人员 Cust126 审核人员 Robin 文档类型 公开发布 / 开发板配套文件 版权信息 Mcuzone 原创文档,

More information

.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident "GCC: (GNU) egcs /Linux (egcs release)" 修改图 6.5 中计算声明名字

.size main,.lfe1-main.local b.comm b,4,4.comm c,4,4.ident GCC: (GNU) egcs /Linux (egcs release) 修改图 6.5 中计算声明名字 实验 : 1 阅读并理解 PL/0 语言前端编译器中的词法分析器, 扩展 PL/0 语言及其编译器, 以增加对上述多行注释的支持 2 [11 月 8 日开始检查 ] 参考 flex-examples, 将 PL/0 编译器中的词法分析部分的实现改造成两种构造方式 : 手工构造 ( 即使用原先在 pl0.c 中定义的 getch 和 getsym 函数 ) 用 flex 自动生成词法分析程序 ( 即编写描述

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

DbgPrint 函数流程分析

DbgPrint 函数流程分析 DbgPrint 函数流程分析 by 小喂 1 DbgPrint 函数流程分析 前言 Windows 下编写内核驱动时经常用到 DbgPrint 函数输出一些调试信息, 用来辅助调试 当正在用 WinDbg 内核调 试时, 调试信息会输出到 WinDbg 中 或者利用一些辅助工具也能看到输出的调试信息, 比如 Sysinternals 公司的 DebugView 工具 本文分析了 Vista 系统上

More information

38 47995529 威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 1059003070 號 39 47995534 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

38 47995529 威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 1059003070 號 39 47995534 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民 1 08414159 惠 鴻 眼 鏡 行 桃 園 市 中 壢 區 福 德 里 中 華 路 一 段 186 號 1 樓 30,000 獨 資 宋 耀 鴻 105/04/27 府 經 登 字 第 1059003866 號 2 17891110 承 元 冷 氣 空 調 工 程 行 桃 園 市 桃 園 區 中 德 里 國 際 路 1 段 98 巷 50 號 2 樓 之 4 200,000 獨 資 詹 安 平

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

Microsoft Word - ~ doc

Microsoft Word - ~ doc EEPROM 功能使用方法 1 适用产品 : 1.1 SM39R16A2/ SM39R12A2/ SM39R08A2 1.2 SM39R4051/ SM39R2051 1.3 SM39R04G1/ SM39R02G1 2 EEPROM 功能概述 : 2.1 使用 code flash 仿真为 Internal EEPROM, 在程序执行时, 可将 code flash 作为 data flash 储存数据使用

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

More information

水晶分析师

水晶分析师 大数据时代的挑战 产品定位 体系架构 功能特点 大数据处理平台 行业大数据应用 IT 基础设施 数据源 Hadoop Yarn 终端 统一管理和监控中心(Deploy,Configure,monitor,Manage) Master Servers TRS CRYSTAL MPP Flat Files Applications&DBs ETL&DI Products 技术指标 1 TRS

More information

漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字

漏 洞 攻 防 EXPLOIT ATTACK & DEFENCE 栏 目 编 辑 脚 本 小 子 scriptsboy@hacker.com.cn HEAD 部 分 大 小 当 然 也 就 是 固 定 的 18200H 如 果 要 提 取 出 HEAD, 我 们 可 以 选 中 前 18200H 字 适 合 读 者 : 入 侵 爱 好 者 溢 出 爱 好 者 前 置 知 识 : 汇 编 语 言 缓 冲 区 溢 出 基 本 原 理 文 / 图 何 永 强 Word 畸 形 数 据 结 构 溢 出 漏 洞 分 析 与 利 用 以 前 都 是 写 远 程 溢 出 漏 洞, 感 觉 也 该 换 换 口 味 了 事 实 上,2005 年 以 来 的 远 程 溢 出 漏 洞, 如 MS05-039 MS06-040

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information