简明X86汇编语言教程
80X86汇编语言电子教案(3-2-MOV指令)
提供的基本寻址方式可以分为三类立即寻址寄存器寻址存储器寻址与存储器有关的寻址的有效地址由以下四种成分组成1位移量存放在指令中的一个81632位的数2基址存放在基址寄存器中的内容3变址存放在变址寄存器中的内容4比例因子386及后继机型增加的一个术语1无比例因子8086286386及后继机型共有位移量直接寻址基址或变址位移量基址或变址—基址变址寻址2带比例因子386及后继机型位移量变址比例因子比例变址寻址比例因子基址+比例因子说明这些寻址方式不仅可以用于源操作数的寻址也可以用于目的操作数的寻址唯一例外的是立即寻址只能用于源操作数例MOV [BX][DI]AX 则源操作数为寄存器寻址目的操作数为基址变址寻址存储器寻址时所确定的内存地址既可以是字节字也可以是双字地址那么上述指令的目的操作数的宽度是多少呢指令中操作数要具有明确的类型寄存器寻址类型确定存储器操作数寻址类型由变量的类型属性确定其它情况类型下操作数类型由指令中其它操作数的类型或指令缺省类型来确定确定的操作数为字类型指令指示对一定操作对象进行何种操作的命令指令系统计算机CPU的指令集合称为指令系统一指令集说明学习要求指令的基本功能二数据传送指令1通用数据传送指令2累加器专用传送指令3地址传送指令4标志寄存器传送指令5类型转换指令特点负责把数据地址或立即数传送到寄存器或存储单元中1通用数据传送指令1传送指令传送指令执行操作DSTSRC DST SRC 的类型要一致双字字节MOV AXMOV AH MOV AX MOV BXMOV MAST[BP][DI]MOV BL MOV BYTE PTR [BX]MOV DSMOV ES MOV AXMOV [BX]MOV DS例MOV EAX MOV ES 哪些指令为非法形式例MOV AXMOV AHMOV AXMOV BXMOV MAST[BP][DI]MOV BLMOV BYTE PTR [BX]MOV DSMOV ESMOV AXMOV [BX]MOV DS寄存器寄存器字寄存器寄存器字节存储器寄存器字存储器寄存器寄存器存储器字节立即数寄存器立即数存储器字节寄存器段寄存器存储器段寄存器段寄存器寄存器存储器存储器段寄存器段寄存器MOV ES立即数段寄存器MOV EAX存储器寄存器双字MOV CS AXMOV 5ALMOV EAX BX都是非法指令如为了使指令字不要过长规定双操作数指令的两个操作数中只能有一个使用存储器寻址方式因此不允许双存储器操作在有通用性MOV [BX]2带符号扩展传送指令有符号数的扩展MOVSX386及后继机型可用格式MOVSX DST, SRC执行操作本指令有两种格式REG1REG源操作数可以是或存储单元的内容目的操作数必须是功能传送时将源操作数符号扩展送入目的寄存器可以是位MOVSX3带零扩展传送指令无符号数的扩展MOVZX386及后继机型可用格式MOVZX DST, SRC执行操作本指令有两种格式REG1REG源操作数目的操作数MOVSX功能传送时将高位扩展为送入目的寄存器可以是位MOVSX例1MOVSX EAX 2MOVZX EAX 若执行前DATA =0FFE0H DATA 为字单元1EAX =0FFFFFFE0H 2EAX=0000FFE0H一般的双操作数指令源目的操作数的长度一致MOVZX MOVSX 指令的源操作数的长度一定要小于目的操作数的长度如MOVSX DXALMOVZX EBXAL 4堆栈操作指令堆栈PC 机的堆栈是在内存中开辟的一端固定一端活动的存储区采用的工作方式栈顶SP 或ESP 址由低注意 1.信息的存入和取出都是从栈顶开始中栈顶由指示当堆栈地址长度为位时堆栈操作使用SP 当堆栈地址长度为位时堆栈操作使用ESP为了将清楚堆栈操作指令我们分8086/8088803868086/8088 PUSH/POP进栈指令执行操作出栈指令执行操作例SP→SP→例SP→SP→ES)=2367H, (SP)=0100H,试画出堆栈的变化情况(SP)=100H12H12H例都是非法指令80386SP SP 2 ESP ESP 2 SP SP 4 ESP ESP 4 1616位位在实方式下803868086为编写80386及后继的程序可利用位通用寄存器可使用新增指令可采用新增的寻址方式但是段的最大长64KB 当存储单元的地址偏移超过64KB 时不会引起地址的反绕而导致段跨越异常在实方式下80386的兼容最大段为64称为位段在保护方式下段长可达4G 称为位段在实方式下运行的程序只能使用位段尽管在实方式下只能使用位段但可以使用位操作数也可以使用位形式表示的存储单元地址例MOV EAX关于实方式程序的几点说明为单位指令可以有四种格式不允许它使用立即数寻址方式指令允许三种格式能为字节类型5PUSHA/PU格式PUSHA286及后继PUSHAD386及后继执行操作PUSHA位通用寄存器依次入栈入栈次序为AX CX DX BX指令执行前的SP BP SI DISP SP-16PUSHAD位通用寄存器依次入栈入栈次序为EAX ECX EDX EBX指令执行前的ESP EBP ESI EDIESP ESP-326POPA/POP格式执行操作POPA位通用寄存器依次出栈出栈次序为DI SI BP SP BX DX CX AXSP SP+16POPAD位通用寄存器依次出栈出栈次序为EDI E SI EBP ESP EBX EDX ECX EAXESP ESP+32PUSHA POPA PUSHAD不影响标志位例例7交换交换指令执行操作OPR1OPR1OPR1例如XCHG EAX,EBX ; EAX 字AL 为要查找数据在表格2累加器专用传送指令EAX AX 传送信息IN OUT 输出程序设计中讲解换码指令格式执行操作累加器EAX AX AL例MOV BX, OFFSET TABLE ; (BX)=0040H长度不超过256)或EBX下标→(AL)3地址传送指令1LEA REG, SRC ;2LDS REG, SRC ;3LES REG, SRC ;4LFS REG, SRC ;5LGS REG, SRC ;6LSS REG, SRC ;把首地址偏移地址传送指令执行操作位有效地址位有效地址位有效地址截取低位有效地址零扩展后存入则MOV BX LEA BXBX =3412H BX=0100HBLOCK的区别假设0100H BLOCK =3412H 例值而不是该地址所在的存储单元的内容必须注意取地址到和寄存器指令执行操作或SREG ←位寄存器REG 不能是段R R LFS 段址偏移地址偏移地址段址例LDS SI, [10H]例LES DI, [BX]例TABLE DW 40H, 3000H , 2000HLSS ESP TABLE ;ESP=30000040H; (SS) =2000H4标志寄存器传送指令执行操作送标志寄存器指令执行操作(FLAGS标志进栈指令执行操作PUSHF: (SP)标志出栈指令执行操作LAHFSAHF例PUSHF TF=1TF15类型转换CBW AL的符号扩展到AH形成中的字CWD/CWDECWD AX的符号扩展到DX形成DX AX双字CWDE AX的符号扩展到EAX形成EAX双字CDQ EAX的符号扩展到EDX形成EDX EAXBSWAP 486及后继机型可用格式BSWAP R32 R32位寄存器操作将位寄存器的字节次序变反即14字节互换23字节互换指令合法的指令格式堆栈操作指令的指令与指令的区别掌握XCHG XLAT MOVSX MOVZX类型转换其余堆栈操作指令标志操作指令MOVSX作业。
x86汇编程序 加法例子
x86汇编程序加法例子x86汇编语言是一种低级程序设计语言,用于编写计算机程序的一种机器语言。
在x86汇编语言中,加法是最基本的算术运算之一。
下面将列举10个符合要求的x86汇编程序加法例子,并对每个例子进行详细解释。
1. 例子一:```assemblysection .datanumber1 dd 10number2 dd 20result dd 0section .textglobal _start_start:mov eax, [number1] ; 将number1的值加载到寄存器eax 中add eax, [number2] ; 将number2的值加到eax寄存器中 mov [result], eax ; 将eax寄存器中的值保存到result 中; 输出结果mov eax, 4 ; 系统调用编号为4,表示输出mov ebx, 1 ; 文件描述符为1,表示标准输出mov ecx, result ; 输出的字符串地址mov edx, 4 ; 输出的字符串长度int 0x80 ; 系统调用; 退出程序mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0int 0x80 ; 系统调用```此程序通过使用`mov`和`add`指令来实现加法运算。
首先,将`number1`和`number2`的值加载到寄存器`eax`中,然后使用`add`指令将两个值相加,将结果保存在`eax`中,最后将结果输出到标准输出。
2. 例子二:```assemblysection .datanumber1 db 10number2 db 20result db 0section .textglobal _start_start:mov al, [number1] ; 将number1的值加载到寄存器al中 add al, [number2] ; 将number2的值加到al寄存器中mov [result], al ; 将al寄存器中的值保存到result 中; 输出结果mov eax, 4 ; 系统调用编号为4,表示输出mov ebx, 1 ; 文件描述符为1,表示标准输出mov ecx, result ; 输出的字符串地址mov edx, 1 ; 输出的字符串长度int 0x80 ; 系统调用; 退出程序mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0int 0x80 ; 系统调用```此程序使用的是8位寄存器`al`进行加法运算。
简明x86汇编语言教程
第一章汇编语言简介先说一点和实际编程关系不太大的东西。
当然,如果你迫切的想看到更实质的内容,完全可以先跳过这一章。
那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:汇编语言到底是什么?汇编语言是一种最接近计算机核心的编码语言。
不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。
不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之外,直接用机器语言写超过1000条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲者一类了。
毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。
熟练的汇编语言编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。
当然,我们有更好的工具——汇编器和反汇编器。
简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。
至于宏汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计算和重写代码。
汇编语言除了机器语言之外最接近计算机硬件的编程语言。
由于它如此的接近计算机硬件,因此,它可以最大限度地发挥计算机硬件的性能。
用汇编语言编写的程序的速度通常要比高级语言和C/C++快很多--几倍,几十倍,甚至成百上千倍。
当然,解释语言,如解释型LISP,没有采用JIT技术的Java虚机中运行的Java 等等,其程序速度更无法与汇编语言程序同日而语。
永远不要忽视汇编语言的高速。
实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的部分以期获得更高的性能。
应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。
我强烈建议所有的软件产品在最后Release之前对整个代码进行Profile,并适当地用汇编取代部分高级语言代码。
至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。
Windows X86 64位汇编语言入门
Windows X86-64位汇编语言入门Windows X64汇编入门(1)最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。
我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。
文章的标题包含了本文的四方面主要内容:(1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista64位版,调用的均为windows API。
(2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。
至于三者间的区别,可自行搜索。
(3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。
(4)入门:既是入门,便不会很全。
其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。
其二,便于类似我这样刚接触x64汇编的新手入门。
本文所有代码的调试环境:Windows Vista x64,Intel Core2Duo。
1.建立开发环境1.1编译器的选择对应于不同的x64汇编工具,开发环境也有所不同。
最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio2005一起发布。
因此,如果你是微软的忠实fans,直接安装VS2005既可。
运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。
第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC资源编译器,且自带了Include目录。
它的最大好外是小,不用为了学习64位汇编安装几个G的VS。
因此,本文的代码就在GoASM下编译。
第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。
不同的编译器,语法会有一定差别,这在下面再说。
1.2IDE的选择搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。
x86汇编语言:从实模式到保护模式(第2版)
16.1 任务的隔离和特权级保护 16.2 代码清单16-1 16.3 内核程序的初始化 16.4 加载用户程序并创建任务 16.5 用户程序的执行 本章习题
17.1 本章代码清单 17.2 任务切换前的设置 17.3 任务切换的方法 17.4 用jmp指令发起任务切换的实例 17.5 处理器在实施任务切换时的操作 17.6 程序的编译和运行 本章习题
第9章 硬盘和 显卡的访问与 控制
5.1 计算机的启动过程 5.2 创建和使用虚拟机
6.1 本章代码清单 6.2 欢迎来到主引导扇区 6.3 注释 6.4 在屏幕上显示文字 6.5 显示标号的汇编地址 6.6 使程序进入无限循环状态 6.7 完成并编译主引导扇区代码 6.8 加载和运行主引导扇区代码 6.9 程序的调试技术
7.1 代码清单7-1 7.2 跳过非指令的数据区 7.3 在数据声明中使用字面值 7.4 段地址的初始化 7.5 段之间的批量数据传送 7.6 使用循环分解数位 7.7 计算机中的负数 7.8 数位的显示 7.9 其他标志位和条件转移指令
8.1 从1加到100的故事 8.2 代码清单8-1 8.3 显示字符串 8.4 计算1到100的累加和 8.5 累加和各个数位的分解与显示 8.6 程序的编译和运行 8.7 8086处理器的寻址方式 本章习题
3.1 寄存器和字长 3.2 内存访问和字节序 3.3 古老的INTEL 8086处理器 本章习题
4.1 汇编语言程序 4.2 NASM编译器 4.3 配书文件包的下载和使用 本章习题
第6章 编写主引 导扇区代码
第5章 虚拟机的 安装和使用
第7章 相同的功 能,不同的代码
第8章 比高斯 更快的计算
精彩摘录
这是《x86汇编语言:从实模式到保护模式(第2版)》的读书笔记模板,可以替换为自己的精彩内容摘录。
汇编语言指令大全X86和X87汇编指令大全(带注释)
汇编语⾔指令⼤全X86和X87汇编指令⼤全(带注释)⽬录⼀、数据传输指令1. 通⽤数据传送指令.2. 输⼊输出端⼝传送指令.3. ⽬的地址传送指令.4. 标志传送指令.⼆、算术运算指令三、逻辑运算指令四、串指令五、程序转移指令六、伪指令七、处理机控制指令:标志处理指令浮点运算指令集1、控制指令2、数据传送指令3、⽐较指令4、运算指令其它1.机械码,⼜称机器码.2.需要熟练掌握的全部汇编知识(只有这么多)3.常见修改(机器码)4.两种不同情况的不同修改⽅法⼀、数据传输指令它们在存贮器和寄存器、寄存器和输⼊输出端⼝之间传送数据.1. 通⽤数据传送指令.MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压⼊堆栈.POP 把字弹出堆栈.PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压⼊堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压⼊堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器⾥字节的顺序XCHG 交换字或字节.(⾄少有⼀个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG ⽐较并交换操作数.(第⼆个操作数必须为累加器AL/AX/EAX)XADD 先交换再累加.(结果在第⼀个操作数⾥)XLAT 字节查表转换.----BX指向⼀张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)2. 输⼊输出端⼝传送指令.IN I/O端⼝输⼊. ( 语法: IN 累加器, {端⼝号│DX} )OUT I/O端⼝输出. ( 语法: OUT {端⼝号│DX},累加器 )输⼊输出端⼝由⽴即⽅式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.3. ⽬的地址传送指令.LEA 装⼊有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送⽬标指针,把指针内容装⼊DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送⽬标指针,把指针内容装⼊ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送⽬标指针,把指针内容装⼊FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送⽬标指针,把指针内容装⼊GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送⽬标指针,把指针内容装⼊SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装⼊AH.SAHF 标志寄存器传送,把AH内容装⼊标志寄存器.PUSHF 标志⼊栈.POPF 标志出栈.PUSHD 32位标志⼊栈.POPD 32位标志出栈.⼆、算术运算指令ADD 加法.ADC 带进位加法.INC 加 1.AAA 加法的ASCII码调整.DAA 加法的⼗进制调整.SUB 减法.SBB 带借位减法.DEC 减 1.NEG 求反(以 0 减之).CMP ⽐较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的⼗进制调整.MUL ⽆符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),IMUL 整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV ⽆符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).IDIV 整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND 与运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上⼋种移位指令,其移位次数可达255次.移位⼀次时, 可直接⽤操作码. 如 SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如 MOV CL,04 SHL AX,CL四、串指令DS:SI 源串段寄存器 :源串变址.ES:DI ⽬标串段寄存器:⽬标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志 0表⽰重复操作中SI和DI应⾃动增量; 1表⽰应⾃动减量.Z标志⽤来控制扫描或⽐较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串⽐较.( CMPSB ⽐较字符. CMPSW ⽐较字. )SCAS 串扫描.把AL或AX的内容与⽬标串作⽐较,⽐较结果反映在标志位.LODS 装⼊串.把源串中的元素(字或字节)逐⼀装⼊AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. ) STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或⽐较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或⽐较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1. ⽆条件转移指令 (长转移)JMP ⽆条件转移指令CALL 过程调⽤RET/RETF 过程返回.2. 条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不⼩于或不等于时转移.JAE/JNB ⼤于或等于转移.JB/JNAE ⼩于转移.JBE/JNA ⼩于或等于转移.以上四条,测试⽆符号整数运算的结果(标志C和Z).JG/JNLE ⼤于转移.JGE/JNL ⼤于或等于转移.JL/JNGE ⼩于转移.JLE/JNG ⼩于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC ⽆进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为 "0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为 "1" 时转移.3. 循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4. 中断指令INT 中断指令INTO 溢出中断IRET 中断返回5. 处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯⽚引线TEST为⾼电平时使CPU进⼊等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置⽅向标志位.CLD 清⽅向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建⽴段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CMC 进位位求反指令STC 进位位置为1指令CLD ⽅向标志置1指令STD ⽅向标志位置1指令CLI 中断标志置0指令STI 中断标志置1指令NOP ⽆操作HLT 停机WAIT 等待ESC 换码LOCK 封锁浮点运算指令集1、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)FINIT 初始化浮点部件机器码 9B DB E3FCLEX 清除异常机器码 9B DB E2FDISI 浮点检查禁⽌中断机器码 9B DB E1FENI 浮点检查禁⽌中断⼆机器码 9B DB E0WAIT 同步CPU和FPU 机器码 9BFWAIT 同步CPU和FPU 机器码 D9 D0FNOP ⽆操作机器码 DA E9FXCH 交换ST(0)和ST(1) 机器码 D9 C9FXCH ST(i) 交换ST(0)和ST(i) 机器码 D9 C1iiiFSTSW ax 状态字到ax 机器码 9B DF E0FSTSW word ptr mem 状态字到mem 机器码 9B DD mm111mmmFLDCW word ptr mem mem到状态字机器码 D9 mm101mmmFSTCW word ptr mem 控制字到mem 机器码 9B D9 mm111mmmFLDENV word ptr mem mem到全环境机器码 D9 mm100mmmFSTENV word ptr mem 全环境到mem 机器码 9B D9 mm110mmmFRSTOR word ptr mem mem到FPU状态机器码 DD mm100mmmFSAVE word ptr mem FPU状态到mem 机器码 9B DD mm110mmmFFREE ST(i) 标志ST(i)未使⽤机器码 DD C0iiiFDECSTP 减少栈指针1->0 2->1 机器码 D9 F6FINCSTP 增加栈指针0->1 1->2 机器码 D9 F7FSETPM 浮点设置保护机器码 DB E42、数据传送指令FLDZ 将0.0装⼊ST(0) 机器码 D9 EEFLD1 将1.0装⼊ST(0) 机器码 D9 E8FLDPI 将π装⼊ST(0) 机器码 D9 EBFLDL2T 将ln10/ln2装⼊ST(0) 机器码 D9 E9FLDL2E 将1/ln2装⼊ST(0) 机器码 D9 EAFLDLG2 将ln2/ln10装⼊ST(0) 机器码 D9 ECFLDLN2 将ln2装⼊ST(0) 机器码 D9 EDFLD real4 ptr mem 装⼊mem的单精度浮点数机器码 D9 mm000mmmFLD real8 ptr mem 装⼊mem的双精度浮点数机器码 DD mm000mmmFLD real10 ptr mem 装⼊mem的⼗字节浮点数机器码 DB mm101mmmFILD word ptr mem 装⼊mem的⼆字节整数机器码 DF mm000mmmFILD dword ptr mem 装⼊mem的四字节整数机器码 DB mm000mmmFILD qword ptr mem 装⼊mem的⼋字节整数机器码 DF mm101mmmFBLD tbyte ptr mem 装⼊mem的⼗字节BCD数机器码 DF mm100mmmFST real4 ptr mem 保存单精度浮点数到mem 机器码 D9 mm010mmmFST real8 ptr mem 保存双精度浮点数到mem 机器码 DD mm010mmmFIST word ptr mem 保存⼆字节整数到mem 机器码 DF mm010mmmFIST dword ptr mem 保存四字节整数到mem 机器码 DB mm010mmmFSTP real4 ptr mem 保存单精度浮点数到mem并出栈机器码 D9 mm011mmmFSTP real8 ptr mem 保存双精度浮点数到mem并出栈机器码 DD mm011mmmFSTP real10 ptr mem 保存⼗字节浮点数到mem并出栈机器码 DB mm111mmmFISTP word ptr mem 保存⼆字节整数到mem并出栈机器码 DF mm011mmmFISTP dword ptr mem 保存四字节整数到mem并出栈机器码 DB mm011mmmFISTP qword ptr mem 保存⼋字节整数到mem并出栈机器码 DF mm111mmmFBSTP tbyte ptr mem 保存⼗字节BCD数到mem并出栈机器码 DF mm110mmmFCMOVB ST(0),ST(i) <时传送机器码 DA C0iiiFCMOVBE ST(0),ST(i) <=时传送机器码 DA D0iiiFCMOVE ST(0),ST(i) =时传送机器码 DA C1iiiFCMOVNB ST(0),ST(i) >=时传送机器码 DB C0iiiFCMOVNBE ST(0),ST(i) >时传送机器码 DB D0iiiFCMOVNE ST(0),ST(i) !=时传送机器码 DB C1iiiFCMOVNU ST(0),ST(i) 有序时传送机器码 DB D1iiiFCMOVU ST(0),ST(i) ⽆序时传送机器码 DA D1iii3、⽐较指令FCOM ST(0)-ST(1) 机器码 D8 D1FCOMI ST(0),ST(i) ST(0)-ST(1) 机器码 DB F0iiiFCOMIP ST(0),ST(i) ST(0)-ST(1)并出栈机器码 DF F0iiiFCOM real4 ptr mem ST(0)-实数mem 机器码 D8 mm010mmmFCOM real8 ptr mem ST(0)-实数mem 机器码 DC mm010mmmFICOM word ptr mem ST(0)-整数mem 机器码 DE mm010mmmFICOM dword ptr mem ST(0)-整数mem 机器码 DA mm010mmmFICOMP word ptr mem ST(0)-整数mem并出栈机器码 DE mm011mmmFICOMP dword ptr mem ST(0)-整数mem并出栈机器码 DA mm011mmmFTST ST(0)-0 机器码 D9 E4FUCOM ST(i) ST(0)-ST(i) 机器码 DD E0iiiFUCOMP ST(i) ST(0)-ST(i)并出栈机器码 DD E1iiiFUCOMPP ST(0)-ST(1)并⼆次出栈机器码 DA E9FXAM ST(0)规格类型机器码 D9 E54、运算指令FADD 把⽬的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在⽬的操作数后的变量或堆栈缓存器) 相加,并将结果存⼊⽬的操作数FADDP ST(i),ST 这个指令是使⽬的操作数加上 ST 缓存器,并弹出 ST 缓存器,⽽⽬的操作数必须是堆栈缓存器的其中之⼀,最后不管⽬的操作数为何,经弹出⼀次后,⽬的操作数会变成上⼀个堆栈缓存器了FIADD FIADD 是把 ST 加上来源操作数,然后再存⼊ ST 缓存器,来源操作数必须是字组整数或短整数形态的变数FSUB 减FSUBPFSUBR 减数与被减数互换FSUBRPFISUBFISUBRFMUL 乘FMULPFIMULFDIV 除FDIVPFDIVRFDIVRPFIDIVFIDIVRFCHS 改变 ST 的正负值FABS 把 ST 之值取出,取其绝对值后再存回去。
ASM:《X86汇编语言-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载
ASM:《X86汇编语⾔-从实模式到保护模式》第8章:实模式下硬盘的访问,程序重定位和加载第⼋章是⼀个⾮常重要的章节,讲述的是实模式下对硬件的访问(这⼀节主要讲的是硬盘),还有⽤户程序重定位的问题。
现在整理出来刚好能和保护模式下的⽤户程序定位作⼀个对⽐。
★PART1:⽤户程序的重定位,硬盘的访问1. 分段、段的汇编地址和段内汇编地址NASM编译器使⽤汇编指令“SECTION”或者“SEGMENT”来定义段。
他的⼀般格式是SECTION 段名称或者SEGMENT段名称(段名称不能重复),另外NASM对段没有数量的限制,⼀个程序可以有很多的代码段和数据段。
Intel处理器要求段在内存中的其是物理地址起码是16字节对齐的,⽽NASM 提供了段的修饰符align,使每⼀个段可以16字节对齐或者32字节对齐,⽐如所谓段的汇编地址其实就是段内第⼀个元素(数据,指令)的汇编地址,16字节对齐的意思是所有段⾸的汇编地址都要可以被16整除,如果存在⼀个段要求16字节对齐,⽽这个段的前⼀个段长度不够使当前段不能16字节对齐,那么编译器会⾃动将前⼀个段补0来使这⼀个段满⾜16字节对齐。
NASM编译器提供以下形式section.段名称.start来获得段的汇编地址,⽐如:另外段还可以加⼀个vsart修饰符,因为在NASM编译器中,即使你定义了⼀个段,段的汇编地址就是段内第⼀个元素的汇编地址,但是在引⽤某个标号的时候(包括section.段名称.start),这个标号的汇编地址还是从整个程序的开头开始计算的,⽽不是对段⾸的偏移。
不过再加了vsart=0的时候,段内所有标号的地址都是相对于当前段⾸的偏移了(当然也可以设定为其他数值,标号的偏移值是在这个值的基础上加上与段⾸的偏移地址。
)2. ⽤户程序头部加载⼀个⽤户程序需要⼀个加载器(在实模式下),⽽加载器是不知道⽤户程序⾥⾯具体的结构和功能的,⼀个程序想要运⾏,那么这个程序就要满⾜运⾏环境的⼀些约定俗成的条件,也就是程序哪些部分要怎么写是固定的,现在我们在MBR加载⼀个程序也是⼀样的,只要⽤户程序在某些部分满⾜⼀些条件,我们的加载器就可以识别并加载它。
汇编语言:x86汇编指令大全及其注意事项
汇编语⾔:x86汇编指令⼤全及其注意事项⽬录Part 1:instructionPart 22.1 (逻辑)运算、移位等常⽤指令2.1 (逻辑)运算、移位等常⽤指令2.2 循环移位指令2.3 数据串操作指令2.4 逻辑运算指令2.5 基于⼤⼩关系的跳转指令2.6 基于单标志位的转移指令Part 1:instruction积少成多,持续更新。
(这将会是⼀个极其漫长的过程)表格中各条指令的顺序根据笔者所认为的重要或常⽤程度进⾏排序,仅供参考。
Part 2本表格中所涉及的F是指状态寄存器,CF指进位标志位,其它以此类推。
2.1 (逻辑)运算、移位等常⽤指令这⼀部分记录汇编语⾔程序设计当中使⽤频率最⾼的⼀部分指令。
2.1 (逻辑)运算、移位等常⽤指令这⼀部分记录汇编语⾔程序设计当中使⽤频率最⾼的⼀部分指令。
指令作⽤注意事项⽰例mov dest,src传送指令1.dest和src不能同时为存储器操作数2.CS不能作为dest3.段寄存器之间不能互相传送4.⽴即数不能送⼊段寄存器mov ax,wordptr[bx+si+2]adddest,src加法指令dest,src不能同时为存储器操作数或段寄存器add ax,cx adcdest,src带进位加法指令dest=dest+src+CF,常⽤于多字节加法inc dest加⼀指令 1.此操作不影响CF的状态inc byte ptr[si]subdest,src减法指令1.dest,src的要求与add相同2.触发OF:异号相减且结果的符号为与被减数不同sub ax,cxsbbdest,src带进位减法常⽤于多字节减法dec dest减⼀指令不影响CF的状态,但其他⼏个标志位都会受到影响dec axmul dest⽆符号乘法指1.dest为字节数据,则与AL相乘,结果放⼊AX2.dest为字数据,与AX相乘结果低16位放⼊AX,⾼16位放⼊DX3.dest不能是⽴即数mul aximul dest有符号乘法细节与mul完全相同,对最⾼位的解释不同imul axdiv dest⽆符号除法1.dest为字节数据,⽤AX除以dest,商放在AL,余数放在AH2.dest为字数据,⽤低16位为AX,⾼16位为DX的双字数据除以dest,商放在AX,余数放在DXidiv dest带符号除法与⽆符号完全相同。
80x86汇编语言程序设计教程答案
80x86汇编语言程序设计教程答案【篇一:《80x86汇编语言程序设计》教案及答案(第二版)】汇编语言程序设计》(第2版)沈美明、温冬婵编著教案编写时间:2007年8月18日前言1. 汇编语言是计算机能提供给用户的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。
2. 汇编语言程序设计是高等院校电子计算机硬、软件及应用专业学生必修的核心课程之一。
它不仅是计算机原理、操作系统等其它核心课程的必要先修课,而且对于训练学生掌握程序设计技术、熟悉上机操作和程序调试技术都有重要作用。
3. 本教材共有十一章,其内容安排如下:(1). 第一、二章为汇编语言所用的基础知识。
(2). 第三章详细介绍80x86系列cpu的指令系统和寻址方式。
(3). 第四章介绍伪操作、汇编语言程序格式及汇编语言的上机过程。
(4). 第五、六章说明循环、分支、子程序结构和程序设计的基本方法。
(5). 第七章说明宏汇编、重复汇编及条件汇编的设计方法。
(6). 第八章叙述输入/输出程序设计方法,重点说明中断原理、中断过程及中断程序设计方式。
(7). 第九章说明bios和dos系统功能调用的使用方法。
(8). 第十~十一章分别说明图形显示、发声及磁盘文件存储的程序设计方法,同时提供各种程序设计方法和程序实例。
附:教学参考书1. 沈美明、温冬婵编著,ibm–pc汇编语言程序设计(第2版),清华大学出版社,2001年(教材)2. 沈美明、温冬婵编著,ibm–pc汇编语言程序设计,清华大学出版社,1991年3. 沈美明、温冬婵编著,ibm–pc汇编语言程序设计—例题习题集,清华大学出版社,1991年6月4. 沈美明、温冬婵、张赤红编著,ibm–pc汇编语言程序设计—实验教程,清华大学出版社,1992年5. 周明德,微型计算机ibm pc/xt(0520系列)系统原理及应用(修订版),清华大学出版社,19916. 郑学坚、周斌,微型计算机原理及应用(第二版),清华大学出版社,19957. 王士元、吴芝芳,ibm pc/xt[长城0520] 接口技术及其应用,南开大学出版社,19908. 杨素行,微型计算机系统原理及应用,清华大学出版社,19959. 戴梅萼、史嘉权,微型计算机技术及应用—从16位到32位(第二版),清华大学出版社,199610. 张昆藏,ibm pc/xt微型计算机接口技术,清华大学出版社,199111. 孟绍光,李维星,高档微机组成原理及接口技术(80386/80486/pentium),学苑出版社,199312. 吴秀清,周荷琴,微型计算机原理与接口技术,中国科学技术大学出版社目录第 1 章基础知识 ....................................................................................................... .. (1)1.1 进位计数制与不同基数的数之间的转换 (1)1.2 二进制数和十六进制数的运算 ....................................................................................................... .. (2)1.3 计算机中数和字符的表示 ....................................................................................................... . (3)1.4 几种基本的逻辑运算 ....................................................................................................... (3)第 2 章 80x86计算机组织 ....................................................................................................... . (4)2.1 80x86微处理器 ....................................................................................................... . (4)2.2 基于微处理器的计算机系统构成 ....................................................................................................... . (4)2.3 中央处理机 ....................................................................................................... . (5)2.4 存储器 ....................................................................................................... (6)2.5 外部设备 ....................................................................................................... .. (7)第 3 章 80x86的指令系统和寻址方式 ....................................................................................................... .. (8)3.1 80x86的寻址方式 ....................................................................................................... (8)3.2 程序占有的空间和执行时间 ....................................................................................................... . (10)3.3 80x86的指令系统 .......................................................................................... .. (10)第 4 章汇编语言程序格式 ....................................................................................................... .. (26)4.1 汇编程序功能 ....................................................................................................... . (26)4.2 伪操作 ....................................................................................................... . (26)4.3 汇编语言程序格式 ....................................................................................................... .. (30)4.4 汇编语言程序的上机过程 ....................................................................................................... .. (33)第 5 章循环与分支程序设计 ....................................................................................................... . (35)5.1 循环程序设计 ....................................................................................................... . (35)5.2 分支程序设计 ....................................................................................................... . (36)5.3 如何在实模式下发挥80386及其后继机型的优势 (36)第 6 章子程序结构 ....................................................................................................... .. (37)6.1 子程序的设计方法 ....................................................................................................... .. (37)6.2 子程序的嵌套 ....................................................................................................... . (38)6.3 子程序举例 ....................................................................................................... .. (38)第 7 章高级汇编语言技术 ....................................................................................................... .. (39)7.1 宏汇编 ....................................................................................................... . (39)7.2 重复汇编 ....................................................................................................... . (40)7.3 条件汇编 ....................................................................................................... . (41)第 8 章输入/输出程序设计 ....................................................................................................... . (42)8.1 i/o设备的数据传送方式 ....................................................................................................... .. (42)8.2 程序直接控制i/o方式 ....................................................................................................... . (43)8.3 中断传送方式 ....................................................................................................... . (43)第 9 章 bios和dos中断 ....................................................................................................... . (46)9.1 键盘i/o ....................................................................................................... .. (46)9.2 显示器i/o ....................................................................................................... . (48)9.3 打印机i/o ....................................................................................................... . (49)9.4 串行通信口i/o ....................................................................................................... .. (50)第 10 章图形与发声系统的程序设计 ....................................................................................................... ........... 51 10.1 显示方 (51)10.2 视频显示存储器 ....................................................................................................... .................................. 51 10.3 ega/vga图形程序设计 ....................................................................................................... .................... 52 10.4 通用发声程序 ....................................................................................................... ...................................... 53 10.5 乐曲程序 ....................................................................................................... . (54)第 11 章磁盘文件存取技术 ....................................................................................................... ........................... 55 11.1 磁盘的记录方式 ....................................................................................................... .................................. 55 11.2 文件代号式磁盘存取 ....................................................................................................... .......................... 56 11.3 字符设备的文件代号式i/o ....................................................................................................... ................ 57 11.4 bios磁盘存取功能 ....................................................................................................... .. (58)附录:《ibm—pc汇编语言程序设计》习题参考答案 ............................................................................... 59 第一章.第二章.第三章.第四章.第五章.第六章.第七章.第八章.第九章.第十章.第十一章. 习题 ....................................................................................................... ................. 59 习................. 60 习题 ....................................................................................................... ................. 61 习题 ....................................................................................................... ................. 74 习题 ....................................................................................................... ................. 79 习题 ....................................................................................................... ................. 97 习题 ....................................................................................................... ............... 110 习题 ....................................................................................................... ............... 117 习题 ....................................................................................................... ............... 122 习题 ....................................................................................................... ............... 125 习题 ....................................................................................................... (136)错误!未指定书签。
汇编语言程序设计_第3章 80x86指令系统
3.3.2 算术指令
1. 加法
一般形式:
ADD dest, src ; dest = dest + src
ADC dest, src ; dest = dest + src + CF
INC
dest
; dest = dest + 1
语法格式:
ADD reg/mem, reg/mem/imm
ADC reg/mem, reg/mem/imm
movsx ax, al ; 等价于cbw movsx eax, ax ; 等价于cwde movsx eax, al ; 等价于顺序执行cbw与cwde
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
(3)MOVZX 一般形式: MOVZX dest, src ; src零扩展为dest;386新增 语法格式: MOVZX reg16, reg8/mem8 MOVZX reg32, reg8/mem8/reg16/mem16
2019/8/26
80x86汇编语言程序设计
3.3.1 数据传送指令
5. 堆栈操作指令
80x86系统的堆栈具有如下特点: 堆栈是在内存的堆栈段中,具有“先进后出”的特点。 堆栈只有一个出入口,即当前栈顶。当堆栈为空时,栈顶和栈底指向同一内存单
元。 堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地
INC
reg/mem
对标志位的影响:
ADD、ADC:按一般规则影响CF、OF、SF和ZF。 INC:不影响CF,其它同ADD。 说明:ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数。
2019/8/26
64位汇编语言简介
x86-64位汇编语言简介一、x86-64的寄存器x86-64较x86-32多了8个通用寄存器,而且,每个通用寄存器都是64位宽,它们是:rax,rbx,rcx,rdx,rsi,rdi,rsp,rbpr8,r9,r10,r11,r12,r13,r14,r15同时,x86-64全面支持x86-32和x86-16的通用寄存器:eax,ax,al,ah,ebx,bx,bl,bh,....而且,还对传统的edi,esi做了改进:edi ,32位di,16位dil ,8位,在传统的x86机器中,di是不可按照8位来访问的,但在x86-64下可以。
同样esi也可以按照8位来访问。
一个很特别的寄存器rip,相当于x86-32的eip.在x86-32是不可直接访问的,如mov eax,eip是错的,但在x86-64位下却可以,如mov,rax,qword ptr [rip+100]是对的。
而且,它除了是个程序计数器外,也是个“数据基地址”,有此可见,它现在是身兼两职!为什么在x86-64位下要用rip做访问数据的基地址呢?因为,在x86-64下,DS,ES,CS,SS都没有实际意义了,也就是说,它们不再参与地址计算,只是为了兼容x86-32。
FS,GS还是参与地址计算,它们两个和x86-32的意义相同。
二、x86-64的汇编x86-64的汇编和x86-32的没有多大的区别。
添加了新寄存器和指令。
写64位汇编代码时,可以用8、16、32、64位寄存器,如:push rdisub rsp, 48 ;mov r10, rcx; Line 36mov rdi, rdxxor eax, eaxmov ecx, 512rep stosb; Line 43movsxd r8, DWORD PTR [r10+16]mov QWORD PTR [rsp+32], rdxmov r9, QWORD PTR [r10+648]mov rdx, QWORD PTR [r10+52]mov rcx, QWORD PTR [r10+44]call fs_read_disk; Line 47mov ecx, 1cmp eax, ecxcmovne ecx, eaxmov eax, ecx; Line 52add rsp, 48pop rdiret 0再如:$L1818:; Line 2398mov al, BYTE PTR [rdx+rbx]cmp al, 32jne SHORT $L1819mov BYTE PTR [rdx+rbx], 0$L1819:add r8d, 1movsxd rdx, r8dxor eax, eaxmov rcx, r12mov rdi, rbxrepne scasbnot rcxsub rcx, 1cmp rdx, rcxjb SHORT $L1818但,有点值得注意,当操作传统的32位寄存器时,那么,整个64位寄存器都会受到影响,如:mov eax,0ah那么,rax也等于000000000000000ah再如:mov rcx,0aaaaaaaaaaaaaaaah(此时ecx等于0aaaaaaaah)mov ecx,0ddddddddh(此时,rcx等于00000000ddddddddh,高32位受到了影响).规则:Example 1: 64-bit Add:Before:RAX =0002_0001_8000_2201RBX =0002_0002_0123_3301ADD RBX,RAX ;48 is a REX prefix for size.Result:RBX = 0004_0003_8123_5502Example 2: 32-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD EBX,EAX ;32-bit addResult:RBX = 0000_0000_8123_5502(32-bit result is zero extended)Example 3: 16-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BX,AX ;66 is 16-bit size overrideResult:RBX = 0002_0002_0123_5502(bits 63:16 are preserved)Example 4: 8-bit Add:Before:RAX = 0002_0001_8000_2201RBX = 0002_0002_0123_3301ADD BL,AL ;8-bit addResult:RBX = 0002_0002_0123_3302(bits 63:08 are preserved)三、指令集变化小结:当然,这里说的都是最基本的东西,是针对通用寄存器言的。
简明X86汇编语言教程
简明X86汇编语言教程在计算机科学领域中,汇编语言是一种低级语言,用于编写和控制计算机硬件操作的程序。
X86汇编语言是一种广泛应用于个人电脑和服务器系统的指令集体系结构。
本教程将简明地介绍X86汇编语言的基本概念、语法和指令集,以帮助初学者入门。
下面将按照教程的逻辑顺序,逐步介绍相关内容。
1. 汇编语言简介汇编语言是机器语言的简化形式,通过使用助记符,可以更便于人们理解和编写程序。
我们将会一起了解如何使用X86汇编语言进行编程,包括数据类型、寄存器的使用和基本指令的命令格式等。
2. 数据传送和运算在这一部分,我们将会学习如何在寄存器中存储和传送数据,以及如何进行基本的算术和逻辑运算。
我们还将介绍一些常用的指令,例如mov、add、sub等。
3. 程序控制结构我们将介绍如何使用条件语句(如if-else和循环语句),以及如何使用标志寄存器来判断程序的执行流程。
同时,我们还将学习如何调用和返回函数。
4. 存储器管理在这个部分,我们将了解如何在程序中使用存储器。
我们将学习如何声明和定义变量、数组和常量,以及如何使用栈来管理函数的调用和返回。
5. 输入和输出我们将会学习如何从键盘读取输入,以及如何将数据输出到屏幕上。
通过学习这些知识,我们可以编写更加实用的程序,与用户进行交互。
6. 异常处理在这一部分,我们将介绍如何处理程序中的异常和错误。
我们将学习如何使用中断来响应外部事件,并进行相应的处理。
我们还将了解如何调试程序,以及如何优化程序的性能。
通过学习本教程,您将掌握X86汇编语言的基本知识和技巧,能够编写简单的汇编程序并进行调试和优化。
希望这个教程对您学习和理解汇编语言有所帮助。
总结本教程简明地介绍了X86汇编语言的基本概念、语法和指令集。
通过系统地学习和实践,您将逐渐掌握汇编语言的编程技巧,并能够编写出高效、可靠的汇编程序。
汇编语言虽然相对较低级,但在某些场景下仍然非常重要,因此掌握汇编语言将为您成为一名更全面的程序员打下稳固的基础。
汇编语言讲义第三章 80x86的寻址方式
32000H
50H 50H
… … … … …
AX
跨段访问情况
•
8086的存储器是分段使用的,通常,若选用寄存器(BX、BP、SI和 DI) 做间接寄存器、变址寄存器或基址寄存器,只要有BP寄存器出现,操作数
就在当前的堆栈段。操作数的物理地址由堆栈段寄存器SS的内容左移4位
与偏移地址EA相加;
• •
…
• 如指令中用BP寄存器,
则操作数的段地址在SS中,即堆栈段。
E9H? 20H
00H
…
基址寻址方式
例10 ADD AX,[SI] ; AX+((DS)×10H+(SI))→AX
DS
… …
AX 11 22H + +
执行前:(AX)= 1122H,(SI)= 20H,
(DS)= 1000H,(10020H)= 3344H 执行后:(AX)= 4466H,(SI)= 20H,
MOV 18,AL ; 18←AL
执行后:(AL)= 12H
例2 MOV AX,2000H ; 2000H→AL 执行后:(AX)= 2000H
CS
E8H 00H 20H
… … … …
2、寄存器寻址方式:R
• 操作数包含于CPU的内部寄存器之中。寄存器名是操作数的符号地址,寄存器
的内容是指令所需的操作数。 例3 INC AX ;(AX)+1→AX
例 MOV AX,BX 例 ADD AX,BX
;(BX)→AX ;(AX)+(BX)→AX
例 SUB AX,BX
;(AX)-(BX)→AX
与数据有关的寻址方式
寻址方式可能有三种情况:
16位寻址
汇编语言 第3章1 80x86的指令系统和寻址方式
CS、DS、SS、ES
寄存器寻址指令
MOV AX,1234H MOV BX,AX ;AX←1234H ;BX←AX
寄存器寻址
3.1.4 存储器寻址方式
指令中给出操作数的主存地址信息(偏移
地址,称之为有效地址EA),而段地址在 默认的或用段超越前缀指定的段寄存器中
8086设计了多种存储器寻址方式
量之和,寄存器可以是BX、BP或SI、DI 有效地址=BX/BP/SI/DI+8/16位位移量
段地址对应BX/SI/DI寄存器默认是DS,对应BP
寄存器默认是SS;可用段超越前缀改变 MOV AX,[DI+06H]; mov ax,table[di] ;AX←DS:[DI+06H] MOV AX,[BP+06H] ;AX←SS:[BP+06H] 相对寻址
;AX←DS:[BX+SI+06H]
相对基址变址
位移量可用符号表示 同一寻址方式有多种表达形式
指令操作数的表达-寄存器
r8——任意一个8位通用寄存器
AH AL BH BL CH CL DH DL
r16——任意一个16位通用寄存器
AX BX CX DX SI DI BP SP
reg——代表r8或r16
(4)基址变址寻址方式
有效地址由基址寄存器(BX或BP)的内容加上
变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对应BP
基址寄存器默认是SS;可用段超越前缀改变 MOV AX,[BX+SI] ;AX←DS:[BX+SI] MOV AX,[BP+DI] ;AX←SS:[BP+DI] MOV AX,DS:[BP+DI] ;AX←DS:[BP+DI]
Windows X86 64位汇编语言入门
Windows X86-64位汇编语言入门Windows X64汇编入门(1)最近断断续续接触了些64位汇编的知识,这里小结一下,一是阶段学习的回顾,二是希望对64位汇编新手有所帮助。
我也是刚接触这方面知识,文中肯定有错误之处,大家多指正。
文章的标题包含了本文的四方面主要内容:(1)Windows:本文是在windows环境下的汇编程序设计,调试环境为Windows Vista64位版,调用的均为windows API。
(2)X64:本文讨论的是x64汇编,这里的x64表示AMD64和Intel的EM64T,而不包括IA64。
至于三者间的区别,可自行搜索。
(3)汇编:顾名思义,本文讨论的编程语言是汇编,其它高级语言的64位编程均不属于讨论范畴。
(4)入门:既是入门,便不会很全。
其一,文中有很多知识仅仅点到为止,更深入的学习留待日后努力。
其二,便于类似我这样刚接触x64汇编的新手入门。
本文所有代码的调试环境:Windows Vista x64,Intel Core2Duo。
1.建立开发环境1.1编译器的选择对应于不同的x64汇编工具,开发环境也有所不同。
最普遍的要算微软的MASM,在x64环境中,相应的编译器已经更名为ml64.exe,随Visual Studio2005一起发布。
因此,如果你是微软的忠实fans,直接安装VS2005既可。
运行时,只需打开相应的64位命令行窗口(图1),便可以用ml64进行编译了。
第二个推荐的编译器是GoASM,共包含三个文件:GoASM编译器、GoLINK链接器和GoRC资源编译器,且自带了Include目录。
它的最大好外是小,不用为了学习64位汇编安装几个G的VS。
因此,本文的代码就在GoASM下编译。
第三个Yasm,因为不熟,所以不再赘述,感兴趣的朋友自行测试吧。
不同的编译器,语法会有一定差别,这在下面再说。
1.2IDE的选择搜遍了Internet也没有找到支持asm64的IDE,甚至连个Editor都没有。
15丨汇编语言学习(二):熟悉X86汇编代码
15|汇编语言学习(二):熟悉X86汇编代码《手把手带你写一门编程语言》你好,我是宫文学。
上一节课,在开始写汇编代码之前,我先带着你在 CPU 架构方面做了一些基础的铺垫工作。
我希望能让你有个正确的认知:其实汇编语言的语法等层面的知识是很容易掌握的。
但要真正学懂汇编语言,关键还是要深入了解 CPU 架构。
今天这一节课,我们会再进一步,特别针对 X86 汇编代码来近距离分析一下。
我会带你吃生成汇编代码的工作就会顺畅很多了!好了,我们开始第一步,通过实际的示例程序,看看 X86 的汇编代码是什么样子的。
学习编译器生成的汇编代码按我个人的经验来说,学习汇编最快的方法,就是让别的编译器生成汇编代码给我们看。
比如,你可以用 C 语言写出表达式计算、函数调用、条件分支等不同的逻辑,然后让 C 语言的编译器编译一下,就知道这些逻辑对应的汇编代码是什么样子了,而且你还可以分析每条代码的作用。
这样看多了、分析多了以后,你自然就会对汇编语言越来越熟悉,也敢自己上手写了。
我们还是采用上一节课那个用 C 语言写的示例函数 foo,我们让这个函数接受一个整型的参数,把它加上 10 以后返回:接着,再输入下面的 clang 或 gcc 命令:然后我们用一个文本编辑器打开 foo.s,你就会看到下面这些汇编代码:123int foo (int a){return a+10;}123clang -S foo.c -o foo.s或gcc -S foo.c -o foo.s123456789101112 .section __TEXT,__text,regular,pure_instructions.build_version macos, 11, 0 sdk_version 11, 3.globl _foo ## -- Begin function foo.p2align 4, 0x90_foo: ## @foo.cfi_startproc## %bb.0:pushq %rbp.cfi_def_cfa_offset 16.cfi_offset %rbp, -16movq %rsp, %rbp.cfi_def_cfa_register %rbp你第一次看到这样的代码的时候,可能会有点被吓着。
第2章 80X86汇编语言与汇编程序(4)—串操作与程序控制指令
DI,200H CX,128 AX,AX STOSW
当然也可以用字节填充 可以使用重复前缀。 当寄存器AL、AX中的数不变 BBB: CLD LEA DI,0500H 时,使用重复前缀,则是对 某一RAM区域进行填充。 MOV CX,256 例如上电复位后,对某一块内 XOR AL,AL 存区域全部填充0 REP STOSB
GLUT_C 2013-08 25
④ 段间直接转移
格式: JMP FAR PTR dst 功能:用dst给出的段内偏移量代替IP,用dst的段地址代替 CS的内容,转移到新的CS: 偏移地址去执行下一条指令。 注意:在汇编语言程序设计中,dst通常使用符号地址。
例如:
MOV JMP AX, [SI] FAR PTR ABCD
GLUT_C
2013-08
8
例:比较1000:0e00H与1000:0400H连续8字节是否相等,只要有 一个不相同的字节,则设置AL=0A5H表示两个字符串不想等,否 则赋值AL=00H。
CMP_S: MOV MOV MOV MOV MOV CLD MOV REPZ JNZ MOV JMP DONE: MOV CMP_END: RET
8086指令系统(续)
GLUT_C
2013-08
1
2.3.5
串操作指令
串操作指令在教材P.128 字符串传送指令 字符串比较指令 字符串检索指令 取字符串指令 存字符串指令
GLUT_C
2013-08
2
1.字符串传送指令 字符串传送指令MOVSB/MOVSW 格式: MOVSB ;用于字节传送 MOVSW ;用于字传送。 特点: ( 1 ) MOVSB 、 MOVSW 指令,源数据串的默认段 基址 DS ,有效地址为 SI ,目的串段基址 ES ,有效 地址DI。 (2)指令前面常加重复前缀REP,重复执行n次。 (3)重复执行次数 由CX指定 (4)每次传送,DI,SI自动修改(字节传送±1,字 传送±2),加减由方向控制为DF确定。
汇编语言基础手册
汇编语言基础手册第一章概述汇编语言是一种低级语言,用于直接操作计算机硬件。
本手册将介绍汇编语言的基础知识和常用指令,帮助读者快速入门汇编语言编程。
第二章寄存器寄存器是汇编语言中最基本的数据存储单元,用于存储和处理数据。
本章将介绍汇编语言中常用的通用寄存器、段寄存器和特殊寄存器,并讲解它们的用途和操作方法。
第三章指令汇编语言的指令是用于完成各种操作的命令,例如数据传送、运算和控制等。
本章将详细介绍常用的数据传送指令、算术指令和逻辑指令,并提供相关的示例代码,帮助读者理解和应用。
第四章内存操作汇编语言中,内存是用于存储数据和指令的重要部分。
本章将介绍如何使用汇编语言进行内存的读取、写入和操作,并提供实际案例来演示内存操作的应用。
第五章程序控制程序控制是汇编语言中的核心内容,用于控制程序的流程和执行顺序。
本章将详细介绍条件转移、循环和子程序等程序控制结构,并提供实例代码以及相应的调试技巧。
第六章 I/O操作汇编语言可以通过输入和输出操作与外部设备进行通信。
本章将介绍如何使用汇编语言进行键盘输入和屏幕输出,并提供相应的示例代码和调试方法,使读者能够灵活运用I/O操作。
第七章常见问题与调试技巧本章将列举一些常见的汇编语言编程问题,并给出相应的解决方案和调试技巧。
读者可以通过学习这些问题和技巧,提高自己的编程能力和问题排除能力。
第八章汇编语言应用本章将介绍汇编语言在实际应用中的一些常见场景,包括操作系统开发、驱动程序编写和嵌入式系统设计等。
读者可以了解到汇编语言的实际用途,并借鉴相关案例来进行实际项目开发。
结语汇编语言是一门重要而底层的编程语言,对于理解计算机系统和进行系统级编程具有重要意义。
通过学习本手册,读者可以掌握汇编语言的基础知识和编程技巧,为进一步深入学习和应用打下坚实基础。
注:本手册基于x86架构进行讲解,部分指令和操作可能在其他架构中有所不同。
读者在实际应用中应结合具体环境和需求进行相应调整和学习。
GNU for x86汇编语法
GNU for x86汇编语法译自“Using as The GNU Assembler January 1994”。
参考Tornado随机文档“GNU Toolkit User's Guide"。
GNU Assembler80386 Dependent Features■ AT&T语法 vs. Intel语法为了保持和gcc的输出的兼容性,as支持AT&T System V/386汇编语法,它和Intel语法有相当大的差别。
强调这个是因为几乎所有的80386文档只使用Intel语法。
两者之间的显著区别是:● AT&T的立即数有前缀'$',Intel的立即数没有前缀(Intel 'push 4'为AT&T 'push $4')。
AT&T的寄存器有前缀'%',Intel的寄存器没有前缀。
AT&T的绝对跳转(和相对PC的跳转相反)jump/call操作数有前缀'*',Intel没有前缀。
● AT&T和Intel语法的源和目的操作数的顺序相反。
Intel的'add eax, 4'等效于AT&T的'addl $4, % eax'。
使用'source, dest'规范的目标是为了和以前的Unix汇编器保持兼容。
● AT&T语法中的内存操作数的宽度是根据操作码名称的最后一个字符决定的。
操作码后缀'b','w',和' l'指定了byte(8-bit),word(16-bit),和long(32-bit)的内存引用。
Intel语法则对内存操作数(不是操作码)加前缀:'byte ptr','word ptr'和'dword ptr'。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
也许通过名字能够更容易地理解这些寄存器之间的关系。EAX 中的 E 的意思是“扩展的”,整 个 EAX 的意思是扩展的 AX。X 的意思 Intel 没有明示,我个人认为表示它是一个可变的量 。 而 AH、AL 中的 H 和 L 分别代表高和低 。
32-bit 宽 意的数值,但通常没有人把它当作通用寄存器来用。DS 是默认段寄存器或选
择器。
EBP 这也是一个作为指针的寄存器。通常,它被高级语言编译器用以建造‘堆栈帧’
来保存函数或过程的局部变量,不过,还是那句话,你可以在其中保存你希望
32-bit 宽
的任何数据。SS 是它的默认段寄存器或选择器。
典型的处理器的主要任务包括
从内存中获取机器语言指令,译码,执行 根据指令代码管理它自己的寄存器 根据指令或自己的的需要修改内存的内容 响应其他硬件的中断请求
一般说来,处理器拥有对整个系统的所有总线的控制权。对于 Intel 平台而言,处理器拥有对数 据、内存和控制总线的控制权,根据指令控制整个计算机的运行。在以后的章节中,我们还将讨 论系统中同时存在多个处理器的情况。
每种计算机都有自己的汇编语言——没必要指望汇编语言的可移植性,选择汇编,意味着选择性 能而不是可移植或便于调试。这份文档中讲述的是 x86 汇编语言,此后的“汇编语言”一词,如 果不明示则表示 ia32 上的 x86 汇编语言。
汇编语言是一种易学,却很难精通的语言。回想当年,我从初学汇编到写出第一个可运行的程 序,只用了不到 4 个小时;然而直到今天,我仍然不敢说自己精通它。编写快速、高效、并且能 够让处理器“很舒服地执行”的程序是一件很困难的事情,如果利用业余时间学习,通常需要 2-3 年的时间才能做到。这份教材并不期待能够教给你大量的汇编语言技巧。对于读者来说,x86 汇编语言"就在这里"。然而,不要僵化地局限于这份教材讲述的内容,因为它只能告诉你汇编语 言是“这样一回事”。学好汇编语言,更多的要靠一个人的创造力于悟性,我可以告诉你我所知 道的技巧,但肯定这是不够的。一位对我的编程生涯产生过重要影响的人曾经对我说过这么一句 话:
简明 x86 汇编语但我想说,汇编语言改变了 20 世纪的历史。与前辈相比,我们 这一代编程人员足够的幸福,因为我们有各式各样的编程语言,我们可以操作键盘、坐在显示器 面前,甚至使用鼠标、语音识别。我们可以使用键盘、鼠标来驾驭“个人计算机”,而不是和一 群人共享一台使用笨重的继电器、开关去操作的巨型机。相比之下,我们的前辈不得不使用机器 语言编写程序,他们甚至没有最简单的汇编程序来把助记符翻译成机器语言,而我们可以从上千 种计算机语言中选择我们喜欢的一种,而汇编,虽然不是一种“常用”的具有“快速原型开发” 能力的语言,却也是我们可以选择的语言中的一种。
简单地说,汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。至于宏 汇编,则是包含了宏支持的汇编语言,这可以让你编程的时候更专注于程序本身,而不是忙于计 算和重写代码。
汇编语言除了机器语言之外最接近计算机硬件的编程语言。由于它如此的接近计算机硬件,因此, 它可以最大限度地发挥计算机硬件的性能。用汇编语言编写的程序的速度通常要比高级语言和 C/C++快很多--几倍,几十倍,甚至成百上千倍。当然,解释语言,如解释型 LISP,没有采用 JIT 技术的 Java 虚机中运行的 Java 等等,其程序速度更无法与汇编语言程序同日而语 。
DS
式)或内存(作为选择器,在保护模式。这个寄存器可以被装入任意数值,然而
祝您编程愉快!
第一章 汇编语言简介
先说一点和实际编程关系不太大的东西。当然,如果你迫切的想看到更实质的内容,完全可以先 跳过这一章。
那么,我想可能有一个问题对于初学汇编的人来说非常重要,那就是:
汇编语言到底是什么? 汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全和 机器语言一一对应。不错,我们可以用机器语言写程序,但现在除了没有汇编程序的那些电脑之 外,直接用机器语言写超过 1000 条以上指令的人大概只能算作那些被我们成为“圣人”的牺牲 者一类了。毕竟,记忆一些短小的助记符、由机器去考虑那些琐碎的配位过程和检查错误,比记 忆大量的随计算机而改变的十六进制代码、可能弄错而没有任何提示要强的多。熟练的汇编语言 编码员甚至可以直接从十六进制代码中读出汇编语言的大致意思。当然,我们有更好的工具—— 汇编器和反汇编器。
为什么要这么做呢?主要由于历史原因。早期的计算机是 8 位的,8086 是第一个 16 位处理器, 其通用寄存器的名字是 AX,BX 等等;80386 是 Intel 推出的第一款 IA-32 系列处理器,所有的 寄存器都被扩充为 32 位。为了能够兼容以前的 16 位应用程序,80386 不能将这些寄存器依旧命 名为 AX、BX,并且简单地将他们扩充为 32 位——这将增加处理器在处理指令方面的成本。
这份教材适合已经学习过某种结构化程序设计语言的读者。其内容基于我在 1995 年给别人讲述 汇编语言时所写的讲义。当然,如大家所希望的,它包含了最新的处理器所支持的特性,以及相 应的内容。我假定读者已经知道了程序设计的一些基本概念,因为没有这些是无法理解汇编语言 程序设计的;此外,我希望读者已经有了比较良好的程序设计基础,因为如果你缺乏对于结构化 程序设计的认识,编写汇编语言程序很可能很快就破坏了你的结构化编程习惯,大大降低程序的 可读性、可维护性,最终让你的程序陷于不得不废弃的代码堆之中。
Intel 微处理器的寄存器列表(在本章先只介绍 80386 的寄存器,MMX 寄存器以及其他新一代处 理器的新寄存器将在以后的章节介绍)
通用寄存器 下面介绍通用寄存器及其习惯用法。顾名思义,通用寄存器是那些你可以根据自己的意愿使用的 寄存器,修改他们的值通常不会对计算机的运行造成很大的影响。通用寄存器最多的用途是计算。
浮躁的人喜欢说,用 C++写程序足够了,甚至说,他不仅仅掌握 C++,而且精通 STL、MFC。 我不赞成这个观点,掌握上面的那些是每一个编程人员都应该做到的,然而 C++只是我们"常用" 的一种语言,它不是编程的全部。低层次的开发者喜欢说,嘿,C++是多么的强大,它可以做任 何事情——这不是事实。便于维护、调试,这些确实是我们的追求目标,但是,写程序不能仅仅 追求这个目标,因为我们最终的目的是满足设计需求,而不是个人非理性的理想。
首先让我来介绍一下 80386 上最常用的 4 个通用寄存器。先瞧瞧下面的图形,试着理解一下:
上图中,数字表示的是位。我们可以看出,EAX 是一个 32-bit 寄存器。同时,它的低 16-bit 又 可以通过 AX 这个名字来访问;AX 又被分为高、低 8bit 两部分,分别由 AH 和 AL 来表示。
我想我在罗嗦了。总之,在我们结束这一章之前,我想说,不要在优化的时候把希望完全寄托在 编译器上——现实一些,再好的编译器也不可能总是产生最优的代码。
第二章 认识处理器
中央处理器(CPU)在微机系统处于“领导核心”的地位。汇编语言被编译成机器语言之后,将由 处理器来执行。那么,首先让我们来了解一下处理器的主要作用,这将帮助你更好地驾驭它。
上述寄存器同 EAX 一样包括对应的 16-bit 和 8-bit 分组。
用作内存指针的特殊寄存器
ESI 通常在内存操作指令中作为“源地址指针”使用。当然,ESI 可以被装入任意的 32-bit 宽 数值,但通常没有人把它当作通用寄存器来用。DS 是默认段寄存器或选择器。
EDI 通常在内存操作指令中作为“目的地址指针”使用。当然,EDI 也可以被装入任
EAX 通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也 32-bit 宽 可以作为内存偏移指针(此时,DS 作为段 寄存器或选择器)
EBX 通用寄存器。通常作为内存偏移指针使用(相对于 EAX、ECX、EDX),DS 是 32-bit 宽 默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。
基本上,这份文档撰写的目标是尽可能地便于自学。不过,它对你也有一些要求,尽管不是很高, 但我还是强调一下。
学习汇编语言,你需要
胆量。不要害怕去接触那些计算机的内部工作机制。 知识。了解计算机常用的数制,特别是二进制、十六进制、八进制,以及计算机保
存数据的方法。 开放。接受汇编语言与高级语言的差异,而不是去指责它如何的不好读。 经验。要求你拥有任意其他编程语言的一点点编程经验。 头脑。
注意,这三个寄存器没有对应的 8-bit 分组。换言之,你可以通过 SI、DI、BP 作为别名访问他 们的低 16 位,却没有办法直接访问他们的低 8 位。
段寄存器和选择器
实模式下的段寄存器到保护模式下摇身一变就成了选择器。不同的是,实模式下的“段寄存器” 是 16-bit 的,而保护模式下的选择器是 32-bit 的。
处理器中有一些寄存器,这些寄存器可以保存特定长度的数据。某些寄存器中保存的数据对于系 统的运行有特殊的意义。
新的处理器往往拥有更多、具有更大字长的寄存器,提供更灵活的取指、寻址方式。
寄存器
如前所述,处理器中有一些可以保存数据的地方被称作寄存器。
寄存器可以被装入数据,你也可以在不同的寄存器之间移动这些数据,或者做类似的事情。基本 上,像四则运算、位运算等这些计算操作,都主要是针对寄存器进行的。
永远不要忽视汇编语言的高速。实际的应用系统中,我们往往会用汇编彻底重写某些经常调用的 部分以期获得更高的性能。应用汇编也许不能提高你的程序的稳定性,但至少,如果你非常小心 的话,它也不会降低稳定性;与此同时,它可以大大地提高程序的运行速度。我强烈建议所有的 软件产品在最后 Release 之前对整个代码进行 Profile,并适当地用汇编取代部分高级语言代码。 至少,汇编语言的知识可以告诉你一些有用的东西,比如,你有多少个寄存器可以用。有时,手 工的优化比编译器的优化更为有效,而且,你可以完全控制程序的实际行为。