<4D F736F F D20B5DAB6FED5C2A3AE BBE3B1E0D3EFD1D4D3EB474343C4DAC7B6BBE3B1E02E646F63>

Size: px
Start display at page:

Download "<4D F736F F D20B5DAB6FED5C2A3AE BBE3B1E0D3EFD1D4D3EB474343C4DAC7B6BBE3B1E02E646F63>"

Transcription

1 第二章.AT&T 汇编语言与 GCC 内嵌汇编 (v0.1) 说到 AT&T 汇编语言, 我们就需要从 Unix 开始说起 Unix 最初是为 PDP-11 开发的, 曾先后被移植到 VAX 及 系列的处理器上, 这些处理器上的汇编语言都采用的是 AT&T 的指令格式 ( 那个时候,Intel 公司还未成立, 而 AT&T 公司尚未被拆分 ) 作为 Unix 家族的一员, 我们今天使用的 Linux 在设计时也是采用的 AT&T 格式的汇编语言 Intel 公司在成立并推出了面向个人用户的微处理器后, 也同时推出了在个人微处理器上运行的汇编语言, 即 Intel 汇编语言, 以及相应的语法 我们以前学习的 8086 宏汇编语言, 由于是基于 Intel 公司的处理器, 所以自然是 Intel 汇编语言 由于在本书其后所提及的一系列实验中, 我们设计的是一个类 Unix 的操作系统, 开发环境也是在 Linux 系统中运行的一些列 GNU 的开发工具 ( 如 GCC 和 GAS), 所以无论从习惯还是从程序设计的角度, 都必须选择 AT&T 汇编语言 这里, 我们对 AT&T 汇编语言以及在 GCC 中内嵌这种类型的汇编语言的语法进行讲解, 以期帮助熟悉 Intel 汇编语言的读者在最短时间内掌握这种类型的汇编语言, 并将所学知识应用到以后的一系列实验中 需要指出的是,AT&T 汇编语言并不是一门全新的语言, 只是在格式上与 Intel 汇编语言有一些差异, 对于熟悉 Intel 汇编语言的读者来说, 在了解了这些差异后是非常容易掌握的 同时, 了解和熟悉 AT&T 汇编语言对于阅读和理解 Linux 内核, 以及内核级的一些程序模块时, 将带来莫大的帮助 所以, 对于 Linux 系统级程序员来说, 这几乎是必不可少的知识积累 2.1 AT&T 汇编语言的相关知识在 Linux 源代码中, 以.S( 或.s) 为扩展名的文件是包含汇编语言代码的文件 这里, 我们结合具体的例子再介绍一些 AT&T 汇编语言的相关知识 1.GNU 汇编程序 GAS(GNU Assembly) 和连接程序我们编写了一个程序后, 就需要对其进行汇编和连接 在 Linux 下有两种方式, 一种是使用汇编程序 GAS 和连接程序 LD, 一种是使用 GCC, 我们先来看一下 GAS 和 LD 的使用 GAS 把汇编语言源文件 (.S 或.s) 转换为目标文件 (.o), 其基本语法如下 : as sourcecode.s -o objfile.o 一旦创建了一个目标文件, 就需要把它连接并执行, 连接一个目标文件的基本语法为 : ld objfile.o -o execode 这里 objfile.o 是目标文件名, 而 execode 是输出 ( 可执行 ) 文件 如果要使用 GNC 的 C 编译器 gcc, 就可以一步完成汇编和连接, 例如 : gcc -o execode sourcecode.s 这里,sourcecode.S 是你的汇编程序, 输出文件 ( 可执行文件 ) 名为 execode 其中, 扩展名必须为大写的 S, 这是因为, 大写的 S 可以使 gcc 自动识别汇编程序中的 C 预处理命令, 像 #include #define #ifdef #endif 等, 也就是说, 使用 gcc 进行编译, 你可以在汇编程序中使用 C 的预处理命令 下面给出一个源程序的例子.data output:.ascii "hello world\n"

2 .text.globl _start _start: movl $4, %eax movl $1, %ebx movl $output, %ecx movl $12, %edx movl $1, %eax 例 1-1 这个程序的结果是在屏幕上打印 hello world 2. AT&T 中的节 (Section) 在 AT&T 的语法中, 一个节由.section 关键词来标识, 当你编写汇编语言程序时, 至少需要有以下三种节 : (1).data 这种节包含程序已初始化的数据, 也就是说, 包含具有初值的那些变量, 例如 : hello :.string "Hello world!\n" hello_len :.long 16 (2).bss 这个节包含程序还未初始化的数据, 也就是说, 包含没有初值的那些变量 当操作系统装入这个程序时将把这些变量都置为 0, 例如 : name :.fill 30 # 用来请求用户输入名字 name_len :.long 0 # 名字的长度 ( 尚未定义 ) 当这个程序被装入时,name 和 name_len 都被置为 0 如果你在.bss 节不小心给一个变量赋了初值, 这个值也会丢失, 并且变量的值仍为 0 使用.bss 比使用.data 的优势在于,.bss 节在编译后不占用磁盘的空间, 这样编译 连接生成的代码的尺寸会比较小 例如, 在磁盘上, 通常一个长整数 (4 个字节 ) 所占用的空间, 就足以存放一个.bss 节 需要注意的是, 编译程序往往把.data 和.bss 放在 4 字节上对齐, 因此, 这两个节的起始地址会是 4 的倍数 同时,4 字节对齐的要求也会导致.data 节所占用的空间往往会大于它实际所需的空间, 且大小为 4 的倍数 例如, 假设.data 总共有 30 字节, 在生成代码时, 由于它和它之后的.bss 节都需要 4 字节对齐, 于是.data 节之后的两个字节都不会被用到, 也就是说实际给了.data 节 32 字节的空间 (3).text 这个节包含程序的代码 需要指出的是, 该节是只读节, 而.data 和.bss 是可读写的节 下面给出一个例子.data output:.ascii "hello world\n".text.globl _start _start:

3 movl $4, %eax movl $1, %ebx movl $output, %ecx movl $12, %edx movl $3, %eax movl $1, %ebx movl $sentence, %ecx movl $30, %edx movl $4, %eax movl $30, %edx movl $1, %eax.bss sentence:.fill 30 例 1-2 例 2-2 的源程序中存在.data.text.bss 三个节.bss 节中的变量会被初始化为 0, 在程序的运行中会先打印 "hello world" 然后再打印 sentence 中后来所输入的字符串 3. 汇编程序指令 (Assembler Directive) 上面介绍的.section 就是汇编程序指令的一种,GNU 汇编程序提供了很多这样的指令 (directive), 这种指令都是以句点. 为开头, 后跟指令名 ( 小写字母 ), 在此, 我们只介绍在内核源代码中出现的几个指令.ascii 语法 :.ascii "string"....ascii 表示零个或多个 ( 用逗号隔开 ) 字符串, 并把每个字符串 ( 结尾不自动加 \0 字符 ) 中的字符放在连续的地址单元 例如例 2-2 中的 : output:.ascii "hello world\n" 在这里, 字符串 output 不会被自动添零, 于是在之后的输出过程中程序需要通过 edx 寄存器来告知系统输出字符串的长度 还有一个与.ascii 类似的.asciz,z 代表 \0, 即每个字符串结尾自动加一个 \0 字符, 例如定义字符串 err_int_msg: err_int_msg:.asciz "Unknown interrupt\n".fill 语法 :.fill repeat, size, value 其中,repeat,size 和 value 都是常量表达式.fill 的含义是反复拷贝 size 个字节, 重复 repeat 次 repeat 可以大于或者等于 0 size 也可以大于等于 0, 但不能超过 8, 如果超过 8, 也只取 8 size 个字节的内容将被填充为 value 的值, 如果 size 的大小大于 value 的存储所需要的容量, 则将高位用 0 来填充 例如,size 为 8, 则最高 4 个字节内容为 0, 最低 4 字节内容置为 value size 和 value 为可选项 如果第二个逗号和 value 值不存在, 则假定 value 为 0 如果第一个逗号和 size 不存在, 则假定 size 为 1 例如:

4 .fill 30, 8, 0 即表示反复 30 次, 每次向 8 个字节中拷贝 0 值.globl 语法 :.globl symbol.globl 使得连接程序 (ld) 能够看到 symbol 如果你的局部程序中定义了 symbol, 那么, 与这个局部程序连接的其他局部程序也能存取 symbol, 例如 : 某个.S 文件的源程序中某一段为如下...data.globl number.set number 10.. 而与该文件属于同一个文件夹的另一.S 文件的某一段代码为..text movl $number %eax.. 可以看到在前一个文件中定义的 globl 变量 number 在后一个文件中可以被引用.rept.endr 语法 :.rept count..endr 把.rept 指令与.endr 指令之间的行重复 count 次, 例如 :.rept 3.long 0.endr 相当于 :.long 0.long 0.long 0 在这里,.rept 指令比较容易和.fill 指令混淆, 它们的区别是.rept 是将.rept 与.endr 之间的指令重复 3 次, 而.fill 则是单纯的重复填充数据.space 语法 :.space size, fill 这个指令保留 size 个字节的空间, 每个字节的值为 fill size 和 fill 都是常量表达式 如果逗号和 fill 被省略, 则假定 fill 为 0 例如: Label:.space 10, 1.byte 语法 :.byte expressions 预留 1 个字节, 并将这个字节的内容赋值为 expression, 如果是用逗号隔开的多个 expression, 则为预留多个这样的字节, 并将它们的内容依次赋值 例如 : Mark:.byte 100.word 语法 :.word expressions 预留 2 个字节, 并将该 2 个字节的内容赋值为 expression, 如果是用逗号隔开的多个

5 expression, 则为预留多个这样的 2 字节, 并将它们的内容依次赋值 例如 : num:.word 0x100.long 这与.word 类似, 只是这里是给双字 (4 个字节 ) 赋值 例如 : number:.long 0x100.set 设定常数, 就好像 C 程序中的 #define 的作用一样 例如 :.set mark, 0x10 这样在接下来的程序中就可以用诸如 movl $mark, eax 这样的指令来引用 mark 下面给出一个源程序的示例可以让读者可以对这些指令有更为深刻的印象.data.globl length.set length, 13 label:.fill 10, 1, 65 hello:.rept 3.ascii "\nhello".endr number:.byte 100.word 0x100.long 0x100 output:.ascii "\nhello world\n".text.globl _start _start: movl $4, %eax movl $1, %ebx movl $label, %ecx movl $10, %edx movl $4, %eax movl $hello, %ecx movl $18, %edx movl $number, %edi movb (%edi), %al movw 0x1(%edi), %ax movl 0x3(%edi), %eax movl $4, %eax movl $output, %ecx movl $length, %edx movl $1, %eax 例 1-3

6 以上这段代码涉及了之前所讲的一些指令, 这段程序首先将 label 所标识的 30 个字符打印出来, 然后再依次将 number 所标识的一个字节 字以及双字复制到 eax 寄存器, 最后在屏幕上打印出 "hello world" 2.2 AT&T 与 Intel 的汇编语言语法区别 AT&T 和 Intel 汇编语言的语法区别主要体现在操作数前缀 赋值方向 间接寻址语法 操作码的后缀上, 而就具体的指令而言, 在同一平台 ( 如本书所涉及的 IA32 平台 ) 上, 两种汇编语言是一致的 下面仅列出这两种汇编语言在语法上的不同点 1. 操作数前缀在 Intel 的汇编语言语法中, 寄存器和和立即数都没有前缀 但是在 AT&T 中, 寄存器前冠以 %, 而立即数前冠以 $ 在 Intel 的语法中, 十六进制和二进制立即数后缀分别冠以 h 和 b, 而在 AT&T 中, 十六进制立即数前冠以 0x, 表 2-1 给出几个相应的例子 表 2-1 Intel 与 AT&T 汇编语言的指令操作数前缀 Intel 语法 AT&T 语法 Mov eax,8 movl $8,%eax Mov ebx,0ffffh movl $0xffff,%ebx int 80h 从表中可以看到在 AT%T 汇编中诸如 "%eax" "%ebx" 之类的寄存器名字前都要加上 "%";"$8" "$0xffff" 这样的立即数之前都要加上 "$" 2. 源 / 目的操作数顺序细心的读者可能已经发现, 在表 2-2 所列出的例子中,Intel 汇编语言的指令与 AT&T 的指令操作数的方向上正好相反 : 在 Intel 语法中, 第一个操作数是目的操作数, 第二个操作数源操作数 而在 AT&T 中, 第一个数是源操作数, 第二个数是目的操作数 AT&T 汇编语言这样设计, 主要是为了接近人们通常的阅读习惯 例如 : 表 2-2 Intel 与 AT&T 汇编语言的指令操作数赋值方向 Intel 语法 AT&T 语法 MOV EAX,8 movl $8,%eax 上表中所举的将立即数复制到寄存器 eax 的例子中, 我们可以看到 Intel 语法是规定 eax 在前, 立即数在后, 而 AT&T 则是 eax 在后 3. 寻址方式与 Intel 的语法比较,AT&T 间接寻址方式可能更晦涩难懂一些 Intel 的指令格式是 segreg:[base+index*scale+disp], 而 AT&T 的格式是 %segreg:disp(base,index,scale) 其中 index/scale/disp/segreg 全部是可选的, 完全可以简化掉 如果没有指定 scale 而指定了 index, 则 scale 的缺省值为 1 segreg 段寄存器依赖于指令以及应用程序是运行在实模式还是保护模式下, 在实模式下, 它依赖于指令, 而在保护模式下,segreg 是多余的 在 AT&T 中, 当立即数用在 scale/disp 中时, 不应当在其前冠以 $ 前缀, 而且 scale,disp 不需要加前缀 & 另外在 Intel 中基地址使用 [ ], 而在 AT&T 中则使用 ( ) 表 2-3Intel 与 AT&T 汇编语言的寻址指令格式 Intel 语法 AT&T 语法 Instr foo,segreg:[base+index*scale+disp] instr %segreg:disp(base,index,scale),foo 下面是 Intel 和 AT&T 汇编寻址的一些具体的例子 :

7 表 2-4Intel 与 AT&T 汇编语言的寻址指令示例 Intel 语法 AT&T 语法 [eax] (%eax) [eax + _variable] _variable(%eax) [eax*4 + _array] _array(,%eax,4) [ebx + eax*8 + _array] _array(%ebx,%eax,8) 4. 标识长度的操作码前缀和后缀在 AT&T 汇编中远程跳转指令和子过程调用指令的操作码使用前缀 l, 分别为 ljmp, lcall, 与之相应的返回指令伪 lret 例如: 表 2-5 Intel 与 AT&T 汇编语言的操作码前缀区别 Intel 语法 AT&T 语法 CALL SECTION:OFFSET lcall $secion:$offset JMP FAR SECTION:OFFSET ljmp $secion:$offset RET FAR STACK_ADJUST lret $stack_adjust 在 AT&T 的操作码后面有时还会有一个后缀, 其含义就是指出操作码的大小 l 表示长整数 (32 位 ), w 表示字 (16 位 ), b 表示字节 (8 位 ) 而在 Intel 的语法中, 则要在内存单元操作数的前面加上 byte ptr word ptr, 和 dword ptr, dword 对应 long 表 2-6 给出几个相应的例子 表 2-6 Intel 与 AT&T 汇编语言的操作码后缀区别 Intel 语法 AT&T 语法 Mov al,bl movb %bl,%al Mov ax,bx movw %bx,%ax Mov eax,ebx movl %ebx,%eax Mov eax, dword ptr [ebx] movl (%ebx),%eax 下面给出一个 32 位下 Intel 与 AT&T 汇编对比的源程序示例 : 首先是 Intel 的汇编.DATA NUM DB 100 DW 100h DD 100h OUTPUT DB "hello world\n" ;.CODE BEGIN:MOV MOV DS, AX MOV EDI, OFFSET NUM MOV AL, BYTE PTR [EDI] MOV AX, WORD PTR [EDI] MOV EAX, DWORD PTR [EDI] MOV ECX, OFFSET OUTPUT MOV EDX, 12 MOV EAX, 4

8 END MOV EBX, 1 INT 80H MOV EAX, 1 INT 80H BEGIN 然后是 AT&T 的汇编.data number:.byte 100.word 0x100.long 0x100 output:.ascii "hello world\n".text.globl _start _start: movl $number, %edi movb (%edi), %al movw 0x1(%edi), %ax movl 0x3(%edi), %eax movl $output, %ecx movl $12, %edx movl $4, %eax movl $1, %ebx movl $1, %eax 例 1-4 上面程序的功能是将先分别将一个字节 字 双字复制到 al ax eax 中, 最后打印出 "hello world", 在这里, 我们依次给出了 Intel 汇编和 AT&T 汇编的程序, 读者可以对比以下两者的不同之处 读者应该还记得我们在 1.1 节中讲述了一个分别在实模式与保护模式下在屏幕上打印字 符串的 Intel 汇编语言的例子, 现在我们会将这个例子改成用 AT&T 汇编写得程序 :.set PROT_MODE_CSEG, 0x8 # 代码段选择子.set PROT_MODE_DSEG, 0x10 # 数据段选择子 r.set CR0_PE_ON, 0x1 # 保护模式启动标识.globl start start:.code16 cli cld # 16 位模式 # 关中断 # 关字符串操作自动增加 # 设置重要数据段寄存器 (DS, ES, SS).

9 xorw %ax,%ax # 将 ax 清零 movw %ax,%ds # 初始化数据段寄存器 movw %ax,%es # 初始化附加段寄存器 movw %ax,%ss # 初始化堆栈段寄存器 # 在实模式下通过向显存中写字节流在屏幕上打印 "hello world" movw $0xb800,%ax movw %ax,%es movw $msg1,%si movw $0xc82,%di movw $8,%cx rep movsb movw movw movw rep $str,%si $0xc94,%di $26,%cx movsb # 打开 A20 seta20.1: inb $0x64,%al # Wait for not busy testb $0x2,%al jnz seta20.1 movb $0xd1,%al # 0xd1 -> port 0x64 outb %al,$0x64 seta20.2: inb $0x64,%al # Wait for not busy testb $0x2,%al jnz seta20.2 movb $0xdf,%al # 0xdf -> port 0x60 outb %al,$0x60 # 从实模式切换到保护模式 lgdt gdtdesc movl %cr0,%eax orl $CR0_PE_ON, %eax movl %eax,%cr0 # 通过长跳转使得程序在切换到保护模式的同时切换到 protcseg 处执行 ljmp $PROT_MODE_CSEG, $protcseg.code32 # 32 模式

10 protcseg: # 在保护模式下设置数据段寄存器 movw $PROT_MODE_DSEG, %ax movw %ax,%ds movw %ax,%es movw %ax,%fs movw %ax,%gs movw %ax,%ss # 在保护模式下打印 "hello world" movl $msg2,%esi movl $0xb8d22,%edi movl $44,%ecx rep movsb spin: jmp spin # GDT 表.p2align 2 gdt: SEG_NULL SEG(STA_X STA_R, 0x0, 0xffffffff) SEG(STA_W, 0x0, 0xffffffff) # GDT 表 4 字节对齐 # 空表项 # 代码段表项 # 数据段表项 gdtdesc:.word 0x17 # gdt 表长度 - 1.long gdt # gdt 表物理地址 # 字符串 msg1:.byte 'r',0xc,'e',0xc,'a',0xc,'l',0xc msg2:.byte 'p',0xc,'r',0xc,'o',0xc,'t',0xc,'e',0xc,'c',0xc,'t',0xc,'e',0xc,'d',0xc str:.byte ':',0xc,' ',0xc,'h',0xc,'e',0xc,'l',0xc,'l',0xc,'o',0xc,' ',0xc,'w',0xc,'o',0xc,'r',0xc,'l',0xc,'d',0xc 例 1-5 在例 2-5 中, 可以看到我们分别在实模式下和保护模式下往显存的 0xb8c82 和 0xb8d22 处写字节流 其中保护模式下是段寄存器 es 的值为 0xb800,di 寄存器为 0xc82, 这样移位加后得到 0xb8c82 物理地址, 而在保护模式下则是段选择子 es 对应的基地址为 0, 而 edi 寄存器中的偏移地址为 0xb8d22, 这样加起来后便得到需要寻找的物理地址

11 图 1-1 示例程序运行结果在上图中我们看到在实模式和保护模式下我们都打印出了 "hello world" 2.3 GCC 内嵌汇编 Linux 操作系统内核代码绝大部分使用 C 语言编写, 只有一小部分使用汇编语言编写, 例如与特定体系结构相关的代码和对性能影响很大的代码 GCC 提供了内嵌汇编的功能, 可以在 C 代码中直接内嵌汇编语言语句, 大大方便了程序设计 1. 基本行内汇编基本行内汇编很容易理解, 一般是按照下面的格式 : asm( statements ); 同时 asm 也可以由 asm 来代替, asm 是 asm 的别名 在 asm 后面有时也会加上 volatile 表示编译器不要优化代码, 后面的指令保留原样, volatile 是它的别名, 在这里值得注意的是无论 asm 还是 volatile 中的每个下划线都不是一个单独的下划线, 而是两个短的下划线拼成的 再后面括号里面的便是汇编指令 例如 : asm volatile ("hlt"); 如果有很多行汇编, 则每一行后要加上 \n\t 例如 : asm( "pushl %eax\n\t" "movl $0,%eax\n\t" "popl %eax"); 实际上 gcc 在处理汇编时, 是要把 asm( ) 的内容 打印 到汇编文件中, 所以格式控制字符是必要的 再例如 : asm("movl %eax,%ebx"); asm("xorl %ebx,%edx"); asm("movl $0,_booga);

12 在上面的例子中, 由于我们在行内汇编中改变了 edx 和 ebx 的值, 但是由于 gcc 的特殊的处理方法, 即先形成汇编文件, 再交给 GAS 去汇编, 所以 GAS 并不知道我们已经改变了 edx 和 ebx 的值, 如果程序的上下文需要 edx 或 ebx 作暂存, 这样就会引起严重的后果. 对于变量 _booga 也存在一样的问题. 为了解决这个问题, 就要用到扩展的行内汇编语法. 2. 扩展的行内汇编在扩展的行内汇编中, 可以将 C 语言表达式指定为汇编指令的操作数, 而且不用去管如何将 C 语言表达式的值读入寄存器, 以及如何将计算结果写回 C 变量, 你只要告诉程序中 C 语言表达式与汇编指令操作数之间的对应关系即可,GCC 会自动插入代码完成必要的操作 使用内嵌汇编, 要先编写汇编指令模板, 然后将 C 语言表达式与指令的操作数相关联, 并告诉 GCC 对这些操作有哪些限制条件 例如在下面的汇编语句 : asm volatile ("movl %1,%0" : "=r" (result) : "r" (input)); movl %1,%0 是指令模板 ; %0 和 %1 代表指令的操作数, 称为占位符, 内嵌汇编靠它们将 C 语言表达式与指令操作数相对应 指令模板后面用小括号括起来的是 C 语言表达式, 本例中只有两个 : result 和 input, 他们按照出现的顺序分别与指令操作数 %0, %1, 对应 ; 注意对应顺序 : 第一个 C 表达式对应 %0 ; 第二个表达式对应 %1, 依次类推, 操作数至多有 10 个, 分别用 %0, %1. %9, 表示 在每个操作数前面有一个用引号括起来的字符串, 字符串的内容是对该操作数的限制或者说要求 result 前面的限制字符串是 =r, 其中 = 表示 result 是输出操作数, r 表示需要将 result 与某个通用寄存器相关联, 先将操作数的值读入寄存器, 然后在指令中使用相应寄存器, 而不是 result 本身, 当然指令执行完后需要将寄存器中的值存入变量 result, 从表面上看好像是指令直接对 result 进行操作, 实际上 GCC 做了隐式处理, 这样我们可以少写一些指令 input 前面的 r 表示该表达式需要先放入某个寄存器, 然后在指令中使用该寄存器参加运算 限制字符必须与指令对操作数的要求相匹配, 否则产生的汇编代码将会有错, 读者可以将上例中的两个 r, 都改为 m (m, 表示操作数放在内存, 而不是寄存器中 ), 编译后得到的结果是 : movl input, result 很明显这是一条非法指令, 因此限制字符串必须与指令对操作数的要求匹配 例如指令 movl 允许寄存器到寄存器, 立即数到寄存器等, 但是不允许内存到内存的操作, 因此两个操作数不能同时使用 m 作为限定字符 3. 扩展的行内汇编的语法内嵌汇编语法如下 : asm ( 汇编语句模板 : 输出部分 : 输入部分 : 破坏描述部分 ); 即格式为 asm ( "statements" : output_regs : input_regs : clobbered_regs); 共四个部分 : 汇编语句模板, 输出部分, 输入部分, 破坏描述部分, 各部分使用 :

13 格开, 汇编语句模板必不可少, 其他三部分可选, 如果使用了后面的部分, 而前面部分为空, 也需要用 : 格开, 相应部分内容为空 下面是一个简单的例子 int main(void) { int dest; int value=1; asm( "movl %1, %0" : "=a"(dest) : "c" (value) : "%ebx"); printf("%d\n", dest); return 0; } 例 1-6 在这段内嵌汇编的意思是将 value 变量的值复制到变量 dest 中, 并指定在汇编中使用 eax 与 ecx 寄存器, 同时在最后标识这两个寄存器的值有被改变 1) 汇编语句模板汇编语句模板由汇编语句序列组成, 语句之间使用 ; \n 或 \n\t 分开 指令中的操作数可以使用占位符引用 C 语言变量, 操作数占位符最多 10 个, 名称如下 :%0,%1, %9 指令中使用占位符表示的操作数, 总被视为 long 型 (4, 个字节 ), 但对其施加的操作根据指令可以是字或者字节, 当把操作数当作字或者字节使用时, 默认为低字或者低字节 对字节操作可以显式的指明是低字节还是次字节 方法是在 % 和序号之间插入一个字母, b 代表低字节, h 代表高字节, 例如 :%h1 2) 输出部分输出部分描述输出操作数, 不同的操作数描述符之间用逗号格开, 每个操作数描述符由限定字符串和 C 语言变量组成 每个输出操作数的限定字符串必须包含 = 表示它是一个输出操作数 例 : asm volatile ("pushfl ; popl %0 ; cli":"=g" (x) ) 在这里 x 便是最终存放输出结果的 C 程序变量, 而 =g 则是限定字符串, 限定字符串表示了对它之后的变量的限制条件, 这样 GCC 就可以根据这些条件决定如何分配寄存器, 如何产生必要的代码处理指令, 以及如何处理操作数与 C 表达式或 C 变量之间的关系 在下一部分我们将详细介绍各类的限制字符 3) 输入部分输入部分描述输入操作数, 不同的操作数描述符之间使用逗号格开, 每个操作数描述符同样也由限定字符串和 C 语言表达式或者 C 语言变量组成 例 : asm volatile ("lidt %0" : : "m" (real_mode_idt)); 4) 限定字符可以看到, 限制字符有很多种, 有些是与特定体系结构相关 此处仅列出一些常用的限

14 定字符和 i386 中可能用到的一些常用的限定符 它们的作用是指示编译器如何处理其后的 C 语言变量与指令操作数之间的关系, 例如是将变量放在寄存器中还是放在内存中等, 下表列出了常用的限定字母 表 2-7 内嵌汇编常用限定符 限定符 描述 a 将输入变量放入 eax b 将输入变量放入 ebx 具体的一 c 将输入变量放入 ecx 个寄存器 d 将输入变量放入 edx s 将输入变量放入 esi D 将输入变量放入 edi q 将输入变量放入 eax ebx ecx edx 中的一个 r 将输入变量放入通用寄存器, 也就是 eax, ebx, ecx, edx, esi, edi 中的一个 A 放入 eax 和 edx, 把 eax 和 edx, 合成一个 64 位的寄存器 (uselong longs) m 内存变量 o 操作数为内存变量, 但是其寻址方式是偏移量类型 内存 V 操作数为内存变量, 但寻址方式不是偏移量类型, 操作数为内存变量, 但寻址方式为自动增量 p 操作数是一个合法的内存地址 ( 指针 ) g 将输入变量放入 eax,ebx,ecx,edx 中的一个或者作为内寄存器或存变量内存 X 操作数可以是任何类型 I 0-31 之间的立即数 ( 用于 32 位移位指令 ) J 0-63 之间的立即数 ( 用于 64 位移位指令 ) 立即数 N 0-255, 之间的立即数 ( 用于 out 指令 ) i 立即数 n 立即数, 有些系统不支持除字以外的立即数, 这些系统应该 使用 n 操作数类 = 操作数在指令中是只写的 ( 输出操作数 ) 型 + 操作数在指令中是读写类型的 ( 输入输出操作数 ) f 浮点数 浮点数 t 第一个浮点寄存器 u 第二个浮点寄存器 G 标准的 % 该操作数可以和下一个操作数交换位置 # 部分注释, 从该字符到其后的逗号之间所有字母被忽略 * 表示如果选用寄存器, 则其后的字母被忽略 另外 0, 1,..., 9 表示用它限制的操作数与某个指定的操作数匹配, 也即该操作数就是指定的那个操作数, 例如用 0 去描述 %1 操作数, 那么 %1 引用的其

15 实就是 %0 操作数, 注意作为限定符字母的 0-9, 与指令中的 %0 - %9 的区别, 前者描述操作数, 后者代表操作数 5) 破坏描述部分修改描述部分可以防止内嵌汇编在使用某些寄存器时导致错误 修改描述符是由逗号隔开的字符串组成的, 每个字符串描述一种情况, 一般是寄存器, 有时也会有 memory 例如 : %eax %ebx memory 等 具体的意思就是告诉编译器在编译内嵌汇编的时候不能使用某个寄存器或者不能使用内存的空间 下面用一些具体的示例来讲述 GCC 如何把内嵌汇编转换成标准的 AT&T 汇编的 首先看一个简单的例子, 这个例子 : int main(void) { int result = 2; int input = 1; asm volatile ("addl %1, %0": "=r"(result): "r"(input)); printf("%d\n", result); return 0; } 这段内嵌汇编原本的目的是输出 1+2=3 的结果, 也就是将 input 变量的值与 result 变量的值相加之后再存入 result 中 可以看到在汇编语句模板中的 %1 与 %0 分别代表 input 与 result 变量, 而 =r 与 r 则表示两个变量在汇编中应该对应两个寄存器, = 表示 result 是输出变量 然而实际运行后发现结果实际上是 2 这是为什么呢? 我们用 (objdump -j.text S 可执行文件名 ) 这样的命令来查看编译生成后的代码发现这段内嵌汇编经 GCC 翻译后所对应的 AT&T 汇编是 : movl $0x2,0xfffffffc(%ebp) movl $0x1,0xfffffff8(%ebp) movl 0xfffffff8(%ebp),%eax addl %eax,%eax movl %eax,0xfffffffc(%ebp) 例 前两句汇编分别是为 result 和 input 变量赋值 input 为输入型变量, 而且需要放在寄存器中,GCC 给它分配的寄存器是 %eax, 在执行 addl 之前 %eax 的内容已经是 input 的值 可见对于使用 r 限制的输入型变量或者表达式, 在使用之前 GCC 会插入必要的代码将他们的值读到寄存器 ; m 型变量则不需要这一步 读入 input 后执行 addl, 显然 addl %eax,%eax 的值不对 再往后看 :movl %eax,0xfffffffc(%ebp) 的作用是将结果存回 result, 分配给 result 的寄存器与分配给 input 的一样, 都是 %eax 综上可以总结出如下几点 : 1. 使用 r 限制的输入变量,GCC 先分配一个寄存器, 然后将值读入寄存器, 最后用该寄存器替换占位符 ; 2. 使用 r 限制的输出变量,GCC 会分配一个寄存器, 然后用该寄存器替换占位符, 但是在使用该寄存器之前并不将变量值先读入寄存器,GCC 认为所有输出变量以前的值都没有用处, 不读入寄存器, 最后 GCC 插入代码, 将寄存器的值写回变量 ; 因为第二条, 上面的内嵌汇编指令不能奏效, 因此需要在执行 addl 之前把 result 的值读

16 入寄存器, 也许再将 result 放入输入部分就可以了 ( 因为第一条会保证将 result 先读入寄存器 ) 修改后的指令如下( 为了更容易说明问题将 input 限制符由 r, 改为 m ): int main(void) { int result = 2; int input = 1; asm volatile ("addl %2,%0":"=r"(result):"r"(result),"m"(input)); printf("%d\n", result); return 0; } 这段内嵌汇编所对应的 AT&T 汇编如下 : movl $0x2,0xfffffffc(%ebp) movl $0x1,0xfffffff8(%ebp) movl 0xfffffffc(%ebp),%eax addl 0xfffffff8(%ebp),%eax movl %eax,0xfffffffc(%ebp) 例 看上去上面的代码可以正常工作, 因为我们知道 %0 和 %1 都和 result 相关, 应该使用同一个寄存器, 而且事实上在实际结果中 GCC 也确实是使用了同一个寄存器 eax, 所以可以得到正确的结果 3 但是为了更保险起见, 为了确保 %0 与 %1 与同一个寄存器关联我们可以使用如下的方法 : int main(void) { int result = 2; int input = 1; asm volatile ("addl %2,%0":"=r"(result):"0"(result),"m"(input)); printf("%d\n", result); return 0; } 它所对应的 AT&T 汇编为 : movl $0x2,0xfffffffc(%ebp) movl $0x1,0xfffffff8(%ebp) movl 0xfffffffc(%ebp),%eax addl 0xfffffff8(%ebp),%eax movl %eax,0xfffffffc(%ebp) 例 输入部分中的 result 用匹配限制符 0 限制, 表示 %1 与 %0, 代表同一个变量, 输入部分说明该变量的输入功能, 输出部分说明该变量的输出功能, 两者结合表示 result 是读写型 因为 %0 和 %1, 表示同一个 C 变量, 所以放在相同的位置, 无论是寄存器还是内存 至此读者应该明白了匹配限制符的意义和用法 在新版本的 GCC 中增加了一个限制字符 +, 它表示操作数是读写型的,GCC 知道应将变量值先读入寄存器, 然后计算, 最后写回变量, 而无需在输入部分再去描述该变量 int main(void) {

17 int result = 2; int input = 1; asm volatile ("addl %1, %0": "+r"(result): "r"(input)); printf("%d\n", result); return 0; } 这段内嵌汇编所对应的 AT&T 汇编为 : movl $0x2,0xfffffffc(%ebp) movl $0x1,0xfffffff8(%ebp) mov 0xfffffffc(%ebp),%eax mov 0xfffffff8(%ebp),%edx add %edx,%eax mov %eax,0xfffffffc(%ebp) 例 通过这段内嵌汇编所对应的 AT&T 汇编我们可以看出系统首先将 result 变量的值读入了 eax 寄存器, 并为 input 变量分配了 edx 寄存器, 然后将 eax 与 edx 的值相加后将结果写入内存 接下来的一个示例要较为复杂一些 : int main(void) { int count=3; int value=1; int buf[10]; asm( "cld \n\t" "rep \n\t" "stosl" : : "c" (count), "a" (value), "D" (buf) ); printf("%d %d %d\n", buf[0],buf[1],buf[2]); } 经 GCC 翻译后所对应的 AT&T 汇编是 : movl 0xfffffff4(%ebp),%ecx movl 0xfffffff0(%ebp),%eax lea 0xffffffb8(%ebp),%edi cld repz stos %eax,%es:(%edi) 例 1-8 在这里 count value 和 buf 是三个输入变量, 它们都是 C 程序中的变量, c a 和 D 表示这三个输入值分别被存放入寄存器 ECX EAX 与 EDI; cld rep stosl 是需要执行的汇编指令 ; 而 %ecx %edi 表示这两个寄存器在指令中被改变了 这段内嵌汇编要做的就是向 buf 中写 count 个 value 值

18 最后我们给出一个比较综合一点的例子 : 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) :"r"(input) :"eax"); printf("%d %d\n", temp,output); return 0; } 这段内嵌汇编经由 GCC 转化成的汇编代码如下 : movl $0x1,0xfffffffc(%ebp) mov 0xfffffffc(%ebp),%edx mov $0x0,%eax mov %eax,0xfffffff4(%ebp) mov %edx,%eax mov %eax,0xfffffff8(%ebp) 例 1-9 可以看到, 由于 input output temp 都是程序局部整型数变量, 于是它们实际上是存放在堆栈中的, 也就是内存中的某个部分 其中 output 和 temp 是输出变量, 而且 =m 表明它们应该在内存中,input 是输入变量, r 表明它应存放在寄存器中, 于是首先把 1 存入 input 变量, 然后将变量的值复制给了 edx 寄存器, 在这里我们可以看到内嵌汇编中使用了破环描述符 eax, 这是告诉编译器在程序中 eax 寄存器已被使用, 这样编译器为了避免冲突会将输入变量存放在除 eax 以外别的寄存器中, 如像我们最后看到的 edx 寄存器 看看内嵌汇编的代码编译生成的 AT&T 汇编, 我们可以发现第二句内嵌汇编中的 %1 转化成了 0xfffffff4 (%ebp), 对应的就是 temp 变量 ; 第三句中的 %2 则对应到了 %edx, 即 input 变量所存放的寄存器 ; 而 %0 就对应到 output 变量所存放的内存位置 0xfffffff8 (%ebp)

Microsoft Word - AT&T2_bold.doc

Microsoft Word - AT&T2_bold.doc AT&T 汇编语言与 GCC 内嵌汇编简介 版本 0.1 时间 04/3/30 EMAIL chforest_chang@hotmail.com 1 AT&T 与 INTEL 的汇编语言语法的区别...3 1.1 大小写...3 1.2 操作数赋值方向...3 1.3 前缀...3 1.4 间接寻址语法...4 1.5 后缀...4 1.6 指令...5 2 GCC 内嵌汇编...5 2.1 简介...5

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11 .. 软件综合实验之操作系统 进入保护模式 陈香兰 中国科学技术大学计算机学院 July 1, 2016 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 1 / 11 提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 2 / 11 实验准备 实验环境准备

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 PowerPoint - 05-第五讲-寻址方式.pptx

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

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

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

,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

<4D F736F F D204C696E757820BBE3B1E0D3EFD1D4BFAAB7A2D6B8C4CF2E646F63>

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

More information

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 第 3 章 8086 的寻址方式和指令系统 (2) 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 1 3.3 8086 指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 3.3.1 数据传送指令 可实现 存储器 立即数 段寄存器 CS DS

More information

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

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

More information

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

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

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

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

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

数据库系统概论

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

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

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

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 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

42 2141601026 2016 11 27 2 1.1............................................. 2 1.2....................................... 2 1.2.1......................................... 2 1.3.............................................

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

本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应

本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应 微机原理习题课 助教 : 王骏腾 本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应 习题 33:Core2 处理器可寻址 存储器? 答案 :4GB 64GB 1TB ( 课本 P18 表 1-6) 第一章 习题 53: 信号的作用是什么? 答案 :I/O 读控制, 低电平有效 ( 两点都要答上, 详细可见课本 P20)

More information

幻灯片 1

幻灯片 1 字符串处理是指对一系列的字母或数字的代码进行相同功能的处理 计算机中字符代码一般都采用 ASCII 码, 每个字符的代码占一个字节, 一组字符串存放在一个连续的存储区中 存放在连续的存储区中的这组字符串, 可看为一个数据块 为了提高对字符串 ( 或数据块 ) 的处理效率,8086/8088 指令系统中专门提供了一组对字符串处理的指令, 这些指令包括 : 字符串传送指令 (MOVS) 字符串比较指令

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

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

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

手册 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

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

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

幻灯片 1

幻灯片 1 3 8086 Tel:2656809 tjx@csu.edu.cn 2005-9-14 1 2005-9-14 2 8086 8 8086 8086 7 2005-9-14 3 PC 2005-9-14 4 2005-9-14 5 81616 2005-9-14 6 [ ] MOV AX, 3064H AX=3064H 16AX OP 64H 30H 2005-9-14 7 16 AX BX CX

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

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

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

<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

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

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

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

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

2. 过程 这里主要使用 gdb 来拆炸弹 当然, 用其他工具来辅助, 应该可以更高效地完成 (gdb) echo ======================= Defuse Phase_1 ==============================\n\n ==================

2. 过程 这里主要使用 gdb 来拆炸弹 当然, 用其他工具来辅助, 应该可以更高效地完成 (gdb) echo ======================= Defuse Phase_1 ==============================\n\n ================== CMU 计算机课程 Bomb Lab 拆除过程解析 Yungang Bao(baoyungang@gmail.com) 2011/10/15 CMU 的计算机系统课程 Lab 有一个是拆炸弹 : 给一个二进制 炸弹 可执行文件, 要猜对 6 条输入才不会引爆, 既有挑战又有趣味 感兴趣的朋友可以尝试一下. CMU 课程网址 :http://csapp.cs.cmu.edu/public/labs.html

More information

微机第02章1(指令寻址)

微机第02章1(指令寻址) 微机原理及应用 主讲 : 谢维成 http://xweicheng.ys168.com scxweicheng@yahoo.com.cn 西华大学电气信息学院 1 第 03 章 80X86 的寻址方式和指令 ( 本章内容 ) 3.1 指令的格式 3.2 8086/8088 的寻址方式 3.3 指令系统 3.3.1 数据传送指令 3.3.2 算术运算指令 3.3.3 逻辑运算与移位指令 3.3.4 串操作指令

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

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

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

数据库系统概论

数据库系统概论 指令系统 是指 CPU 能完成的所有 指令的集合, 它是在 CPU 设计时就确定了的 所以, 对不同的 CPU, 其指令系统中所包含的具体指令将是各不相同的 但 8088/8086 CPU 的指令系统是完全一样的 8088/8086 CPU 的指令系统可分成下面 9 类 : (1) 数据传送指令 ; (2) 算术运算指令 ; (3) 逻辑运算指令 ; (4) 移位指令 ; (5) 标志处理指令和 CPU

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

<4D F736F F F696E74202D DB5DAB0CBBDB22DBBE3B1E0D3EFD1D4B3CCD0F22E >

<4D F736F F F696E74202D DB5DAB0CBBDB22DBBE3B1E0D3EFD1D4B3CCD0F22E > 第八讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 汇编语言的主要特点 二 汇编语言程序的结构 三 汇编语言的基本语法 四 汇编语言程序的开发调试 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 5 章汇编语言的基本语法第 6 章汇编语言程序设计及应用 1 主要内容 一 汇编语言的主要特点 二 汇编语言程序的结构 三 汇编语言的基本语法 四 汇编语言程序的开发调试

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

浙江大学本科论文模板

浙江大学本科论文模板 本 科 生 毕 业 设 计 报 告 项 目 名 称 微 型 操 作 系 统 的 设 计 与 实 现 姓 名 与 学 号 曲 国 铖 3063027053 指 导 老 师 王 新 宇 专 业 计 算 机 科 学 与 技 术 学 院 计 算 机 学 院 A Dissertation Submitted to Zhejiang University for the Degree of Bachelor of

More information

Microsoft Word - ha0013s.doc

Microsoft Word - ha0013s.doc 文件编码 :HA0013s 简介 : 本文介绍利用 8 位微控制器控制 DV16100NRB 液晶显示驱动器的方法 该 LCM 由内置的 Hitachi HD44780 进行驱动及控制 本文应用中, 着重考虑如何使微控制器产生正确的信号以符合 LCM 所需的时序 若要获得详细的时序及指令信息, 请查阅 LCM 厂商的资料 LCM 能以 4 位或 8 位模式工作 在 4 位模式下, 传送一个字符或一条指令需两个传输周期完成

More information

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode]

Microsoft PowerPoint - BECKHOFF技术_ADS通讯 [Compatibility Mode] 的架构 ADS 的通讯机制 ADS-Client Request -> Confirmation Indication

More information

C

C C 2017 4 1 1. 2. while 3. 4. 5. for 6. 2/161 C 7. 8. (do while) 9. 10. (nested loop) 11. 12. 3/161 C 1. I 1 // summing.c: 2 #include 3 int main(void) 4 { 5 long num; 6 long sum = 0L; 7 int status;

More information

于是 run, 输入, 果然 :Phase 1 defused. How about the next one? 然后来看 phase2: 08048bb6 <phase_2>: 8048bb6: 55 push %ebp 8048bb7: 89 e5 mov %esp,%ebp 8048bb9:

于是 run, 输入, 果然 :Phase 1 defused. How about the next one? 然后来看 phase2: 08048bb6 <phase_2>: 8048bb6: 55 push %ebp 8048bb7: 89 e5 mov %esp,%ebp 8048bb9: 二进制炸弹实验报告 登录服务器后, 首先运行静态分析工具 OBJDUMP 来获得程序的反汇编版本 bomb.txt, 用 word 打开便可通过汇编代码来分析程序 运行 gdb bomb, 便可以在开始进行动态调试 首先要做的是 break explode_bomb, 即在爆炸函数的的入口设置断点, 这样就可以避免调试过程中各种原因引起的爆炸 首先来看 phase1 的代码 : 08048b90 :

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

程序 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 - 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

主要内容 : 汇编语言源程序的结构汇编语言语句格式伪指令语句功能调用汇编语言程序设计方法宏汇编和条件汇编 2015 年 3 月 30 日星期一 7 时 58 分 57 秒 2

主要内容 : 汇编语言源程序的结构汇编语言语句格式伪指令语句功能调用汇编语言程序设计方法宏汇编和条件汇编 2015 年 3 月 30 日星期一 7 时 58 分 57 秒 2 第 4 章 汇编语言程序设计 (1) 2015 年 3 月 30 日星期一 7 时 58 分 56 秒 1 主要内容 : 汇编语言源程序的结构汇编语言语句格式伪指令语句功能调用汇编语言程序设计方法宏汇编和条件汇编 2015 年 3 月 30 日星期一 7 时 58 分 57 秒 2 机器语言 二进制数形式的指令和数据 B0 64 是什么意思? 这就是机器语言 既不直观, 又不易理解和记忆. MOV

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

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

修改图 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

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

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

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

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

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

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

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

Microsoft PowerPoint - Ch3-8086CPUæ„⁄令系ç»�(3)-æŁ°æ“®ä¼€é•†æ„⁄令

Microsoft PowerPoint - Ch3-8086CPUæ„⁄令系ç»�(3)-æŁ°æ“®ä¼€é•†æ„⁄令 2017 版 微机原理与系统设计 第 3 章 8086CPU 指令系统 董明皓, 博士 西安电子科技大学 dminghao@xidian.edu.cn 目录 (12 课时 ) 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 微机原理与系统设计 8086CPU 的指令系统董明皓 dminghao@xidian.edu.cn 2 基础知识引入

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

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

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

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

《计算概论》课程 第十九讲 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

格式化字符串 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

Microsoft Word - 第一章. 概述.doc

Microsoft Word - 第一章. 概述.doc 第一章. 概述 1.1 80386 保护模式简介 本章的主要内容是介绍 80386 保护模式 1. 保护模式简介 Intel 推出 x86 架构已近 30 年, 刚开始推出的 8086 处理器是一款 16 位的处理器, 它标志着 x86 架构的诞生, 这种 16 位处理器数据总线是 16 位的, 而地址总线是 20 位的, 最多可以寻址 1MB 的地址空间 之后的 80286 处理器也是 16 位,

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

(2) Function 0BH: Function 0CH: (pixel, picture element) Function 0DH: Function 0FH: Function 13H:

(2) Function 0BH: Function 0CH: (pixel, picture element) Function 0DH: Function 0FH: Function 13H: (1) INT 10H Function 00H: Function 01H: Function 02H: Function 03H: Function 05H: Function 06H: Function 07H: Function 08H: Function 09H: Function 0AH: (2) Function 0BH: Function 0CH: (pixel, picture element)

More information

Microsoft Word - 11.doc

Microsoft Word - 11.doc 除 錯 技 巧 您 將 於 本 章 學 到 以 下 各 項 : 如 何 在 Visual C++ 2010 的 除 錯 工 具 控 制 下 執 行 程 式? 如 何 逐 步 地 執 行 程 式 的 敘 述? 如 何 監 看 或 改 變 程 式 中 的 變 數 值? 如 何 監 看 程 式 中 計 算 式 的 值? 何 謂 Call Stack? 何 謂 診 斷 器 (assertion)? 如 何

More information

微机原理--汇编、连接和调试

微机原理--汇编、连接和调试 微机原理课程 汇编语言程序的编辑 汇编 连接和调试 西安电子科技大学 探测制导系 内容提要 编写汇编语言程序的五个重要步骤 编写源程序 汇编过程 连接过程 汇编语言编程过程 DEBUG 主要功能 DEBUG 命令 程序设计举例 结束语 编写汇编语言程序的五个重要步骤 1. 编写源程序, 如 L1.ASM 2. 汇编源程序, 得到目标代码,L1.OBJ 3. 目标代码文件的连接, 生成可执行文件 L1.EXE

More information

<4D6963726F736F667420576F7264202D2032303037C4EAC6D5CDA8B8DFB5C8D1A7D0A3D5D0C9FAC8ABB9FACDB3D2BBBFBCCAD4CEC4BFC6D7DBBACDCAD4BEEDBCB0B4F0B0B82DD6D8C7ECBEED2E646F63>

<4D6963726F736F667420576F7264202D2032303037C4EAC6D5CDA8B8DFB5C8D1A7D0A3D5D0C9FAC8ABB9FACDB3D2BBBFBCCAD4CEC4BFC6D7DBBACDCAD4BEEDBCB0B4F0B0B82DD6D8C7ECBEED2E646F63> 2007 年 普 通 高 等 学 校 招 生 全 国 统 一 考 试 ( 重 庆 卷 ) 文 综 试 卷 第 一 部 分 本 部 分 共 35 题, 每 题 4 分, 共 140 分 在 每 题 给 出 的 四 个 选 项 中, 只 有 一 项 最 符 合 题 目 的 要 求 的 读 图 1, 回 答 1-3 题 1. 某 两 洲 面 积 之 和 与 某 大 洋 面 积 十 分 接 近, 它 们 是

More information

Microsoft PowerPoint - 03.Fortran程序设计基础1

Microsoft PowerPoint - 03.Fortran程序设计基础1 简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST,

More information



 华中科技大学计算机科学与技术学院 编译原理 大型项目训练报告 题目 : 一个面向对象的类 java 的编译器 的设计与实现 专业 : 计算机科学与技术 班级 : 计科卓工 1201 学号 : U201214842 姓名 : 朱凡 成绩 : 指导教师 : 徐丽萍 完成日期 : 2015 年 7 月 7 日 目录 一. 实验概述... 1 1.1 实验要求...1 1.2 实验完成情况概述...1 1.3

More information

<4D F736F F F696E74202D D D6B8C1EECFB5CDB DC6E4CBFBD6B8C1EE2E BBCE6C8DDC4A3CABD5D>

<4D F736F F F696E74202D D D6B8C1EECFB5CDB DC6E4CBFBD6B8C1EE2E BBCE6C8DDC4A3CABD5D> 2018 版 微机原理与接口技术 第三章 8086CPU 指令系统 董明皓 dminghao@xidian.edu.cn 1 2 3 4 5 汇编语言基本概念汇编语言指令分类数据与转移地址的寻址方式 8086 的六类指令总结 1 2 3 4 5 汇编语言基本概念汇编语言指令分类数据与转移地址的寻址方式 8086 的六类指令总结 4. 8086 的指令系统 b b b b b 数据传送指令算术运算指令逻辑运算指令移位

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

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

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

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

漏 洞 攻 防 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

Guava学习之Resources

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

More information

<4D F736F F D20B5DAC8FDD5C22E20CFB5CDB3B5C4C6F4B6AFBACDB3F5CABCBBAF2E646F63>

<4D F736F F D20B5DAC8FDD5C22E20CFB5CDB3B5C4C6F4B6AFBACDB3F5CABCBBAF2E646F63> 第三章. 系统的启动和初始化 (v0.1) 3.1 系统的启动过程 本节将通过 lab1 具体介绍一下 JOS 的启动过程, 我们将讲述 BIOS 对系统的初始化 Boot Loader 程序的功能以及内核可执行文件装入内存的过程 通过本节的讲述读者将会了解到 PC 启动的一般原理 1. 物理内存的分布我们首先来分析一下 PC 开机以后的默认的物理内存的分配 PC 的物理内存空间会由硬件规定产生如下图所示的布局

More information

习 题 一

习  题  一 第 1 页共 13 页 微机原理与接口技术 A 卷 一 填空题 ( 共计 20 分 每个空 2 分 ) 1 已知 [X] 补 =01100011B, 求 X=( ) ( 结果用十进制表示 ) [Y] 补 =11111001B, 求 Y=( ) ( 结果用十进制表示 ) 2 8088CPU 的地址总线为多少条 ( ); 直接寻址的内存空间为多少 ( ) 3 已知 DS=2000H, 内存 (20200H)=FFH,(20201H)=22H

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

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

PowerPoint 演示文稿

PowerPoint 演示文稿 Python 入门 孙栩 xusun@pku.edu.cn 1 课程的整体介绍 目录 contents 2 Python 的介绍及如何安装 Python 3 使用 Python 编写简单小程序 1 课程的整体介绍 课程的整体介绍 Python 入门 1. Python 的介绍与安装 2. 变量与表达式 3. 一些简单的小程序 数据结构 1. 字符串 2. 列表 3. 元组 4. 字典 5. 集合 分支与循环

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

《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

ebook8-30

ebook8-30 3 0 C C C C C C++ C + + C++ GNU C/C++ GNU egcs UNIX shell s h e l l g a w k P e r l U N I X I / O UNIX shell awk P e r l U N I X C C C C C C U N I X 30.1 C C U N I X 70 C C U N I X U N I X U N I X C Dennis

More information

<4D F736F F D20CEC4BCFEBCB6B6F1D2E2B4FAC2EBC9A8C3E8D2FDC7E6D6D0B5C4BCD3BFC7CAB6B1F0BCBCCAF52E646F6378>

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

More information

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温 爱 情 飞 过 苍 凉 / 作 者 :18758265241 1 红 色 格 子 的 旅 行 箱, 在 湿 漉 漉 地 上 发 出 刺 啦 刺 啦 的 声 音, 那 么 刺 耳, 就 像 是 此 刻 杜 晗 的 里 一 样, 烦 躁 而 不 安 就 这 样 走 出 来 了,18 年 禁 锢 自 己 的 地 方 就 在 身 后, 杜 晗 手 指 关 节 泛 白, 紧 紧 地 拉 着 旅 行 箱, 走

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC General instruction format for machine code 611 37100 微處理機原理與應用 Lecture 04-4 MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE

More information

Abstract arm linux tool-chain root NET-Start! 2

Abstract arm linux tool-chain root NET-Start! 2 Lab III - Embedding Linux 1 Abstract arm linux tool-chain root NET-Start! 2 Part 1.4 Step1. tool-chain 4 Step2. PATH 4 Part 2 kernel 5 Step1. 5 Step2... 6 Step3...8 Part 3 root. 8 Step1. 8 Step2. 8 Part

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_04.ppt MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC MACHINE LANGUAGE CODING AND THE DEBUG SOFTWARE DEVELOPMENT PROGRAM OF THE PC 4.1 Converting Assembly Language Instructions to

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