汇编语言手册
汇编指令手册
计算机寄存器常用指令
一、常用指令
1. 通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
一、常用指令
二、算术运算指令
三、逻辑运算指令
四、串指令
五、程序跳转指令
------------------------------------------
计算机寄存器分类简介:
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否
则,OF的值被清为0。
“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。
二、状态控制标志位
状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。
1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。
汇编语言程序设计指导手册
《微机原理与接口技术》实验指导手册(内部资料)2009年9月巫宗宾、薛培根说明一:通信专业(必做实验1、3、4、9、10)二、电子专业(必做实验1、3、4、5、6、8、9、10)三、计算机专业(必做实验3、4、5、6、7、8、9、10)四、计算机/文秘(必做实验3、4、5、6、7、8、9、10)五、其余实验可以选做实验一:多字符输出一、实验目的1、初步掌握汇编语言程序的建立、编译、连接、运行等过程2、了解简单程序设计方法3、掌握DOS中断调用方法4、掌握汇编程序的结构二、实验内容设数据段有一个字符串X,其定义如下:X DB “hello,world$”请调用DOS中断02H,输出字符,采用循环程序设计。
三、参考程序Data segmentX db “ hello,world$”Data endsCode segmentAssume cs:code,ds:dataStart: mov ax,dataMov ds,ax___________Dec siMov cx,0bhOK: ___________________Mov ah,02hInt 21hLoop ______Mov ah,4chInt 21hCode endsEnd start实验二:字符串输出一、实验目的1、了解简单程序设计方法2、掌握DOS中断调用方法3、掌握汇编程序的结构二、实验内容设数据段有一个字符串X,其定义如下:X DB “hello,world$”请调用DOS中断09H,输出字符串。
三、参考程序Data segmentX db “hello,world$”Data endsCode segmentAssume cs:code,ds:dataStart: mov ax,dataMov ds,axMov ax,seg xMov ds,axLea dx ,xMov ah,09hInt 21hMov ah,4chInt 21hCode endsEnd start实验三:字符串操作一、实验目的1、了解字符串程序设计方法2、掌握DOS中断调用方法3、掌握汇编程序的结构二、实验内容设数据段有一个字符串X,其定义如下:X DB “hello,world$”,附加段有一字符串Y,其定义如下Y DB 12 DUP(?),完成X 传送到Y,并调用DOS中断09H,输出字符串Y。
汇编语言入门教程
汇编语言入门教程汇编语言是一种低级编程语言,直接与计算机硬件进行交互,对于学习计算机原理和底层开发非常重要。
本文将为您介绍汇编语言的基本概念和使用方法,以及如何开始编写汇编程序。
一、汇编语言简介汇编语言是一种以指令集为基础的机器语言,它使用助记符号来代替二进制代码,使程序的编写更加直观。
汇编语言与特定的计算机体系结构紧密相关,不同的处理器有不同的汇编语言。
二、准备工作在开始学习汇编语言之前,您需要一台支持汇编语言开发的计算机和相应的开发工具。
常用的汇编语言开发工具有MASM、NASM和FASM等。
您可以根据自己的需求选择合适的工具。
三、汇编指令和寄存器1. 汇编指令汇编语言的指令包括数据传输指令、算术逻辑指令、控制转移指令等。
每个指令执行特定的操作,例如MOV指令可以将数据从一个位置传输到另一个位置。
2. 寄存器寄存器是计算机内部一小块非常快速的内存空间,用于存储临时数据和地址。
常见的寄存器有通用寄存器、状态寄存器和段寄存器等。
在编写汇编程序时,您需要了解不同寄存器的作用和使用方法。
四、汇编程序的基本结构一个典型的汇编程序由如下几个部分组成:1. 数据段:用于存储程序所需的数据2. 代码段:包含汇编指令,定义程序执行的步骤和过程3. 堆栈段:用于存储程序的运行时数据和函数调用时的参数五、汇编程序实例以下是一个简单的汇编程序示例,实现将两个数相加并将结果存储到指定的位置:```assemblysection .datanumber1 db 10number2 db 5result db ?section .textglobal _start_start:mov al, [number1] ; 将number1的值加载到AL寄存器add al, [number2] ; 将number2的值加到AL寄存器mov [result], al ; 将结果存储到result变量中mov eax, 1 ; 系统调用号:标准输出mov ebx, 1 ; 文件描述符:标准输出流mov ecx, result ; 输出的数据mov edx, 1 ; 数据的长度int 0x80 ; 调用系统中断mov eax, 0x1 ; 系统调用号:退出程序xor ebx, ebx ; 错误代码为0int 0x80 ; 调用系统中断```六、汇编语言学习资源如果您想深入学习汇编语言,以下是一些优秀的学习资源:1. 《汇编语言程序设计》(王爽):经典的汇编语言入门教材,适合初学者。
汇编语言入门汇编指令及寄存器详解教程
汇编语⾔⼊门汇编指令及寄存器详解教程⽬录前⾔什么是汇编语⾔汇编语⾔产⽣的原因汇编与⼆进制的关系寄存器寄存器作⽤存取速度⽐较寄存器分类常⽤寄存器⽤途寄存器EAX、AX、AH、AL的关系汇编语⾔指令数据传送指令算术运算指令逻辑运算指令循环控制指令转移指令linux 和 windows 下汇编的区别总结前⾔我们⼤都是被⾼级语⾔惯坏了的⼀代,源源不断的新特性正在逐步添加到各类⾼级语⾔之中,汇编作为最接近机器指令的低级语⾔,已经很少被直接拿来写程序了,不过我还真的遇到了⼀个,那是之前的⼀个同事,因为在写代码时遇到了成员函数权限及可见性的问题,导致他⽆法正确调⽤想执⾏的函数,结果他就开始在C++代码⾥嵌⼊汇编了,绕过了种种限制终于如愿以偿,但是读代码的我们傻眼了…因为项⽬是跨平台的,代码推送的 Linux 上编译的时候他才发现,汇编代码的语法在 Linux 和 Windows 上居然是不⼀样的,结果他⼜⽤⼀个判断平台的宏定义“完美”的解决了,最终这些代码肯定是重写了啊,因为可读性太差了,最近在学习左值、右值、左引⽤和右引⽤的时候,总是有⼈⽤程序编译⽣成的中间汇编代码来解释问题,看得我迷迷糊糊,所以决定熟悉⼀下简单的汇编指令,边学习边记录,⽅便今后忘记了可以直接拿来复习。
什么是汇编语⾔汇编语⾔是最接近机器语⾔的编程语⾔,引⽤百科中的⼀段话解释为:汇编语⾔(assembly language)是⼀种⽤于电⼦计算机、微处理器、微控制器或其他可编程器件的低级语⾔,亦称为符号语⾔。
在汇编语⾔中,⽤助记符代替机器指令的操作码,⽤地址符号或标号代替指令或操作数的地址。
汇编语⾔⼜被称为第⼆代计算机语⾔。
汇编语⾔产⽣的原因对于绝⼤多数⼈来说,⼆进制程序是不可读的,当然有能⼈可以读,⽐如第⼀代程序员,但这类⼈快灭绝了,直接看⼆进制不容易看出来究竟做了什么事情,⽐如最简单的加法指令⼆进制表⽰为00000011,如果它混在⼀⼤串01字符串中就很难把它找出来,所以汇编语⾔主要就是为了解决⼆进制编码的可读性问题。
汇编指令手册(英文缩写原码)
汇编指令手册(英文缩写原码)1.通用数据传送指令.MOV----> moveMOVSX---->extended move with sign dataMOVZX---->extended move with zero dataPUSH---->pushPOP---->popPUSHA---->push allPOPA---->pop allPUSHAD---->push all dataPOPAD---->pop all dataBSWAP---->byte swapXCHG---->exchangeCMPXCHG---->compare and changeXADD---->exchange and addXLAT---->translate2.输入输出端口传送指令.IN---->inputOUT---->output3.目的地址传送指令.LEA---->load effective addressLDS---->load DSLES---->load ESLFS---->load FSLGS---->load GSLSS---->load SS4.标志传送指令.LAHF---->load AH from flagSAHF---->save AH to flagPUSHF---->push flagPOPF---->pop flagPUSHD---->push dflagPOPD---->pop dflag二、算术运算指令ADD---->addADC---->add with carryINC---->increase 1AAA---->ascii add with adjustDAA---->decimal add with adjustSUB---->substractSBB---->substract with borrowDEC---->decrease 1NEC---->negativeCMP---->compareAAS---->ascii adjust on substractDAS---->decimal adjust on substractMUL---->multiplicationIMUL---->integer multiplicationAAM---->ascii adjust on multiplicationDIV---->divideIDIV---->integer divideAAD---->ascii adjust on divideCBW---->change byte to wordCWD---->change word to double wordCWDE---->change word to double word with sign to EAXCDQ---->change double word to quadrate word三、逻辑运算指令———————————————————————————————————————AND---->andOR---->orXOR---->xorNOT---->notTEST---->testSHL---->shift leftSAL---->arithmatic shift leftSHR---->shift rightSAR---->arithmatic shift rightROL---->rotate leftROR---->rotate rightRCL---->rotate left with carryRCR---->rotate right with carry四、串指令———————————————————————————————————————MOVS---->move stringCMPS---->compare stringSCAS---->scan stringLODS---->load stringSTOS---->store stringREP---->repeatREPE---->repeat when equalREPZ---->repeat when zero flagREPNE---->repeat when not equalREPNZ---->repeat when zero flagREPC---->repeat when carry flagREPNC---->repeat when not carry flag五、程序转移指令———————————————————————————————————————1>无条件转移指令(长转移)JMP---->jumpCALL---->callRET---->returnRETF---->return far2>条件转移指令(短转移,-128到+127的距离内)JAE---->jump when above or equalJNB---->jump when not belowJB---->jump when belowJNAE---->jump when not above or equalJBE---->jump when below or equalJNA---->jump when not aboveJG---->jump when greaterJNLE---->jump when not less or equalJGE---->jump when greater or equalJNL---->jump when not lessJL---->jump when lessJNGE---->jump when not greater or equalJLE---->jump when less or equalJNG---->jump when not greaterJE---->jump when equalJZ---->jump when has zero flagJNE---->jump when not equalJNZ---->jump when not has zero flagJC---->jump when has carry flagJNC---->jump when not has carry flagJNO---->jump when not has overflow flagJNP---->jump when not has parity flagJPO---->jump when parity flag is oddJNS---->jump when not has sign flagJO---->jump when has overflow flagJP---->jump when has parity flagJPE---->jump when parity flag is evenJS---->jump when has sign flag3>循环控制指令(短转移)LOOP---->loopLOOPE---->loop equalLOOPZ---->loop zeroLOOPNE---->loop not equalLOOPNZ---->loop not zeroJCXZ---->jump when CX is zeroJECXZ---->jump when ECX is zero4>中断指令INT---->interruptINTO---->overflow interruptIRET---->interrupt return5>处理器控制指令HLT---->haltWAIT---->waitESC---->escapeLOCK---->lockNOP---->no operationSTC---->set carryCLC---->clear carryCMC---->carry make changeSTD---->set directionCLD---->clear directionSTI---->set interruptCLI---->clear interrupt六、伪指令—————————————————————————————————————DW---->definw wordPROC---->procedureENDP---->end of procedureSEGMENT---->segmentASSUME---->assumeENDS---->end segmentEND---->end。
6502汇编语言程序设计手册
6502汇编语言程序设计手册一、引言6502汇编语言是一种基于6502微处理器的指令集架构的低级编程语言。
它被广泛应用于上世纪70年代和80年代的家用电脑,如Commodore 64、Apple II等。
由于其广泛的应用和较为简单的指令集,6502汇编语言具有一定的历史意义和学习价值。
二、基础知识1. 6502微处理器6502微处理器是由MOS Technology公司设计制造的一款8位微处理器,于1975年发布。
它的指令集架构简单而灵活,共有56条指令,包括算术运算、逻辑运算、分支、跳转等。
6502微处理器的寄存器包括累加器(A)、X、Y寄存器,以及程序计数器(PC)、状态寄存器(SR)、堆栈指针(SP)等。
2. 汇编语言汇编语言是一种将机器指令和助记符一一对应的低级语言。
通过使用汇编语言编写程序,程序员可以更直接地控制计算机的硬件,实现更高效的程序执行。
在6502汇编语言中,每一条汇编指令都对应着6502微处理器的一条机器指令,因此编写的汇编程序可以直接在6502微处理器上执行。
三、程序设计1. 环境准备在编写6502汇编程序之前,需要准备好能够运行6502汇编程序的环境。
一般来说,可以使用模拟器或原始硬件来进行程序的调试和执行。
有一些模拟器可以在现代计算机上运行,如VICE模拟器,能够模拟Commodore 64的硬件环境,非常适合6502汇编程序的开发。
2. 开发工具6502汇编程序的开发工具主要包括文本编辑器和汇编器。
文本编辑器用于编写汇编程序的源代码,而汇编器则用于将源代码转换成机器码。
经典的6502汇编器包括ACME、DASM等,它们能够将6502汇编语言源代码转换成可执行的二进制文件。
3. 基本语法6502汇编语言的基本语法类似于其他汇编语言,包括标号、指令、操作数和注释等组成部分。
在编写6502汇编程序时,需要注意每条指令的操作数数量和类型,以及指令的执行顺序。
合理地使用标号和注释可以使程序更易读和易于维护。
汇编语言手册
寄存器与存储器1. 寄存器功能. 寄存器的一般用途和专用用途. CS:IP 控制程序执行流程. SS:SP 提供堆栈栈顶单元地址. DS:BX(SI,DI) 提供数据段内单元地址. SS:BP 提供堆栈内单元地址. ES:BX(SI,DI) 提供附加段内单元地址. AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。
. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。
2. 存储器分段管理. 解决了16位寄存器构成20位地址的问题. 便于程序重定位. 20位物理地址=段地址* 16 + 偏移地址. 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。
3. 堆栈. 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。
. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。
.堆栈总是以字为单位存取指令系统与寻址方式1. 指令系统. 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。
执行指令后,一般源操作数不变,目的操作数被计算结果替代。
. 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。
2. 寻址方式. 寻址方式确定执行指令时获得操作数地址的方法. 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。
. 与数据有关的寻址方式的一般用途:(1) 立即数寻址方式--将常量赋给寄存器或存储单元(2) 直接寻址方式--存取单个变量(3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度(4) 寄存器间接寻址方式--访问数组元素(5) 变址寻址方式(6) 基址变址寻址方式(7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素. 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP. 与转移地址有关的寻址方式的一般用途:(1) 段内直接寻址--段内直接转移或子程序调用(2) 段内间接寻址--段内间接转移或子程序调用(3) 段间直接寻址--段间直接转移或子程序调用(4) 段间间接寻址--段间间接转移或子程序调用汇编程序和汇编语言1. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的过程称为汇编。
汇编语言标准手册
汇编语言标准手册《汇编语言标准手册》一、介绍汇编语言是一种低级的计算机程序设计语言,直接操作计算机硬件。
汇编语言标准手册是程序员在学习和开发汇编语言程序时的重要参考资料。
本手册将详细介绍汇编语言的基本语法和常见指令,帮助读者掌握汇编语言编程技巧。
二、汇编语言基础1. 汇编语言的特点汇编语言与高级语言相比具有直观、高效的特点。
程序员可以直接操作寄存器、内存和指令,实现对计算机硬件的精细控制。
2. 汇编语言的基本语法汇编语言的基本语法包括标号、指令、操作数和注释等部分。
标号用于标识程序中的跳转位置,指令用于执行具体的操作,操作数指明参与操作的数据,注释是对代码的解释说明。
3. 寄存器和内存汇编语言通过寄存器和内存来实现数据的存储和处理。
寄存器是位于CPU内部的一组高速存储单元,用于临时存储和操作数据,而内存则是用于长期存储数据的地方。
三、汇编语言指令集1. 数据传输指令数据传输指令用于将数据从一个位置复制到另一个位置,例如MOV指令可以将数据从一个寄存器复制到另一个寄存器或内存位置。
2. 算术和逻辑指令算术和逻辑指令用于进行各种数学和逻辑运算,例如ADD指令可以将两个数相加,AND指令可以进行按位与操作。
3. 跳转指令跳转指令用于控制程序的执行流程,例如JMP指令可以无条件跳转到目标位置,JZ指令可以在条件满足时跳转。
4. 推入和弹出指令推入和弹出指令用于栈的操作,例如PUSH指令可以将数据压入栈中,POP指令可以从栈中弹出数据。
四、实例演示1. 程序初始化程序初始化是编写汇编语言程序的第一步,包括设置栈帧、初始化寄存器和变量等操作。
2. 循环和条件判断循环和条件判断是控制程序流程的重要结构,通过判断条件并根据结果进行跳转和执行不同的指令,实现程序的灵活控制。
3. 数据处理和显示数据处理和显示是汇编语言程序中常见的操作,例如对输入的数据进行处理后输出显示,或者进行数据的排序和统计等操作。
五、汇编语言调试技巧1. 单步执行在调试汇编语言程序时,可以使用单步执行功能逐条执行并观察每条指令的结果,帮助定位错误。
TMS320汇编语言工具用户指南
TMS320C1x/C2x/C2xx/C5x汇编语言工具用户指南———P3-4至P3-113.3.汇编器的调用调用汇编器的命令如下:dspa [input file [object file [listing file] ] ][—option]dspa 为调用汇编器的命令。
input file 为汇编源文件的名称。
如果不提供扩展名,则汇编器默认的扩展名为.asm 。
若不提供输入文件名, 则汇编器将提示输入文件名。
object file 为汇编器产生的目标文件的名称。
如果不提供扩展名, 则汇编器默认的扩展名为.obj。
如果不提供目标文件名, 则汇编器将使用与源文件相同的文件名,但扩展名为.obj。
listing file 为汇编器产生的供选择的列表文件。
如果不提供列表文件名, 则汇编器将不产生列表文件,除非使用—i(或大写L)选项,此时汇编器将使用与输入的源文件相同的文件名,若不提供扩展名,则汇编器将使用默认的扩展名.lst。
—option 选项定义要使用汇编器选项。
选项不分大小写,可能出现在命令行中汇编器名称之后的任何地方。
在每个选项前面加有短横。
不带参数的单字符选项可结合使用,例如,—lc等效与—l—c,带参数的选项如—i必须分别指定。
—a 产生一个绝对地址列表。
当使用—a时, 汇编器不产生目标文件。
—a选项与绝对地址列表器结合使用。
—c 使汇编语言文件中不区分大小写。
例如, —c将使符号ABC 和abc 等效。
如果不使用该选项, 则默认为程序符号区分大小写。
—d —cdname [ =value] 设置符号名的值。
等效与在汇编文件的开始处插入name.set value,若value省略,则符号值设置为1。
对于更多信息, 参见3.5.1, P3-12 。
—i 指定汇编器寻找由copy 、include, 或mlib等伪指令命名的文件的目录。
—i 选项的格式是—ipathname 。
每次可使用多达10个—i选项,每个—i选项指定一个路径。
汇编语言_入门经典教材-230页 汇编入门(7 讲)
汇编入门(7 讲)时间:2009-5-16 8:12:26 出处:核心提示:第5 章微机CPU 的指令系统指令系统确定了CPU 所能完成的功能,是用汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规定,那么,肯定不能灵活运用汇编语言。
所以,本章的内容是学习本课程的重点和难点。
5.1 汇编语言指令格式为了介绍指令系统中指令的功能,先要清楚汇编语言是如何书写指令的...第5章微机CPU的指令系统指令系统确定了CPU 所能完成的功能,是用汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规定,那么,肯定不能灵活运用汇编语言。
所以,本章的内容是学习本课程的重点和难点。
5.1 汇编语言指令格式为了介绍指令系统中指令的功能,先要清楚汇编语言是如何书写指令的,这就象在学习高级语言程序设计时,要清楚高级语言语句的语义、语法及其相关规定一样。
5.1.1 指令格式汇编语言的指令格式如下:指令助忆符[ 操作数1 [, 操作数2 [, 操作数3]]] [; 注释]指令助忆符体现该指令的功能,它对应一条二进制编码的机器指令。
指令的操作数个数由该指令的确定,可以没有操作数,也可以有一个、二个或三个操作数。
绝大多数指令的操作数要显式的写出来,但也有指令的操作数是隐含的,不需要在指令中写出。
当指令含有操作数,并要求在指令中显式地写出来时,则在书写时必须遵守:指令助忆符和操作数之间要有分隔符,分隔符可以是若干个空格或TAB 键;如果指令含有多个操作数,那么,操作数之间要用逗号"," 分开。
指令后面还可以书写注释内容,不过,要在注释之前书写分号";"。
5.1.2了解指令的几个方面在学习汇编指令时,指令的功能无疑是我们学习和掌握的重点,但要准确、有效地运用这些指令,我们还要熟悉系统对每条指令的一些规定或约束。
归纳起来,对指令还要掌握以下几个方面内容:、要求指令操作数的寻址方式;、指令对标志位的影响、标志位对指令的影响;、指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令(见附录2 )。
汇编语言程序设计常用资料速查手册
汇编程序设计常用资料速查手册1 常用DOS命令1.显示目录命令DIR该命令用来列出指定盘、指定目录或指定文件的目录。
命令格式有一下三种:DIR [<盘符>][/P][/W]DIR [<目录路径名>][/P][/W]DIR [<文件路径名>][/P][/W]其中/P表示分页显示;/W表示紧缩格式显示,即一行显示多个文件。
[ ]中内容为任选项;< >中内容必须输入。
文件路径名为:[<盘符>][<路径>]<文件名>目录路径名为:[<盘符>]<路径>文件名中可用通配符“*”和“?”,“*”代表任意一串字符,“?”代表任意一个字符。
例如:若要显示D盘MASM目录下的所有扩展名为ASM文件的DOS命令为:DIR D:\MASM\*.ASM2.文件改名命令REN该命令用来更改文件名,格式为:REN <旧文件路径名> <新文件名>旧文件路径名定义同第一点中的文件路径名,文件名中可用通配符“*”和“?”。
例如:若要将D盘MASM目录下的test.lst文件改名为test.asm,其DOS命令为:REN D:\MASM\TEST.LST TEST.ASM3.文件复制命令COPY该命令将一个或多个文件复制成副本,格式为:COPY <文件路径名> <文件路径名>文件路径名定义同第一点中的文件路径名,文件名中可用通配符“*”和“?”。
例如:若要将D盘MASM 目录下的所有扩展名为ASM的文件复制到C盘的EXAMPLE目录下,其DOS命令为:COPY D:\MASM\*.ASM C:\EXAMPLE若要将当前目录下的TEST.ASM文件复制成TEST1.ASM,其DOS命令为:COPY TEST.ASM TEST1.ASM4.文件删除命令DEL该命令将一个或多个文件删除,格式为:DEL <文件路径名>文件路径名定义同第一点中的文件路径名,文件名中可用通配符“*”和“?”。
51汇编操作手册
行的实际机器指令码。
目标代码文件格式如下:
:cc aaaa tt dd aa dd ss <CR>
计数器 记录地址 数据类型 记录地址 代码的字节 和校验 回车
移量),或者为伪指令中的变量输初值。
为便于程序设计,常量有多种表示形式:二、十、十六进制数和字符串等,它们的格式各不相同,并采用不同的基数标记加以区分。表-
1列出其格式。
表-1
数据形式 格 式 取值范围 示 例 备
注
2进制 ********B 0,1 10110011B
10进制 ****** 0,1,2...9 32768 缺省基数标记
这一类语句即通常所说的伪指令,它指示汇编程序后面的指示性语句如何产生代码。
ASM-51宏汇编完全支持Inter助记符的汇编语言,因此汇编程序的格式,指令完全与8051汇编语言一样,这里不再介绍它们的指令系统。
1、4 常量与数值运算
(1) 常量及其表示
常量,就是在汇编时已经确定的值。 在汇编语言中,常量主要用作指令性语句中的直接操作数 , 也可用于存储器操作的组成部分(如位
综合运算规则 2: 当两个操作数之间没有参数相隔时, 第二个操作符优先于第一个操作符计算。
例如: R1 SET NOT 10011010B
其结果应为 65H。
1、5 程序分段
8051系列的处理器的结构, 把内存分成五个独立的内存段, 即代码段(段名CSEG),数据段(段名DSEG), 外部段(段名XSEG),功能段
EQU 为常量,符号名等定义符号化常量名 符号名不能重名定义
= 为常量,符号名等定义符号化常量名 符号名不能重名定义
汇编指令手册
数据传送指令通用传送指令MOVMOVSXMOVZXLEA指针传送指令LDSLESLFSLOSLSS标志寄存器传送指令LAHFSAFH交换指令 XCHG字节交换指令 BSWAP查表指令 XLAT堆栈操作指令进栈指令 PUSH出栈指令 POP16位标志寄存器栈操作进栈指令 PUSHF出栈指令 POPF32位标志寄存器栈操作进栈指令 PUSHFD出栈指令 POPFD16位通用寄存器栈操作进栈指令 PUSHA出栈指令 POPA32位通用寄存器栈操作进栈指令 PUSHAD出栈指令 POPAD通用传送指令指令名格式功能描述影响标志位注意事项MOV MOV DST, SRC (DST) ←(SRC)将一个字节或一个字操作数从源地址传送至目的地址。
MOV指令不改变源操作数,也不影响标志位1)源和目的操作数不能同时为存储器操作数例:MOV [DI],[SI];是非法指令2)立即数不能作为目的操作数例:MOV 1234H,AX ;是非法指令3)不能将立即数直接传送到段寄存器例:MOV DS,1000H;是非法指令4)源和目的操作数的数据位应等长,即同为字节、字或双字。
必须用PTR运算符说明目的操作数的属性(可以是BYTE、WORD、DWORD)。
MOV BYTE PTR [BX],12H5)以CS为目标的一切转送都是非法的。
MOVSX MOVSX DST,SRCMove with SignExtend (386+)将SRC的符号位向高位扩展,使其与目标操作数字长相同,再送到DST,而SRC保持不变。
MOV指令不改变源操作数,也不影响标志位(1)DST为REG16或REG32,SRC为小于等于DST的立即数或存储器操作数或寄存器操作数。
(2)对于带符号数的补码,扩展前后的真值相等,只有补码的位数不同。
例:MOV DL,-16 ; DL=0F0HMOVSX BX,DL ; BX=0FFF0H, DL不变MOVZX MOVZX DST,SRCMove with ZeroExtend (386+)将SRC的高位用0补充,使其与目标操作数字长相同,再送到DST,而SRC保持不变。
IA-32指令集汇编语言说明书
for (j=0; j<4; j++) printf("Byte %d: %x\n", j, p[j]);
}
Byte 0: ff"
Output on a
Byte 1: 77"
little-endian
Byte 2: 33"
machine
Byte 3: 0"
6
IA-32 General Purpose Registers"
char i; … if (i > 5) {
i++; else
i--; }
cmpb $5, %al jle else incb %al jmp endif else: decb %al endif:
8
C Example: Four-Byte Data"
Global int variable i is in %eax, the full 32 bits of the “A” register.
• Character: 1 byte! • Short, int, and long: varies, depending on the computer! • Float and double: varies, depending on the computer! • Pointers: typically 4 bytes!
• Register addressing!
• Example: movl %edx, %ecx" • Choice of register(s) embedded in the instruction! • Copy value in register EDX into register ECX!
汇编手册
je(jne,jz,jnz) =>jmp相应的机器码EB (出错信息向上找到的第一个跳转)jmp的作用是绝对跳,无条件跳,从而跳过下面的出错信息
xxxxxxxxxxxx 出错信息,例如:注册码不对,sorry,未注册版不能...,"Function Not Avaible in Demo" 或 "Command Not Avaible" 或 "Can't save in Shareware/Demo"等 (我们希望把它跳过,不让它出现)
ROR 循环右移。
RCL 通过进位的循环左移。
RCR 通过进位的循环右移。
以上八种移位指令,其移位次数可达255次。
移位一次时, 可直接用操作码。 如 SHL AX,1。
移位>1次时, 则由寄存器CL给出移位次数。
如 MOV CL,04
SHL AX,CL
四、串指令
───────────────────────────
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时重复。
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节。( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
汇编指令手册
8086/8088指令系统8086/8088的指令系统丰富,而且指令的功能也强。
大多数指令既能处理字数据,又能处理字节数据;算术运算和逻辑运算不局限于累加器,存储器操作数也可直接参加算术逻辑运算。
8086/8088的指令系统可分为如下六个功能组:(1)数据传送(2)算术运算(3)逻辑运算(4)串操作(5)程序控制(6)处理器控制汇编语言语句的一般格式。
指令语句可由四部分组成,一般格式如下:[标号:] 指令助记符 [操作数1] [操作数2] [;注释]指令是否带有操作数,完全取决于指令本身标号的使用取决于程序的需要,标号只被汇编程序识别,它与指令本身无关。
(一)数据传送指令数据传送指令组又可分为:传送指令,交换指令,地址传送指令,堆栈操作指令,标志传送指令,查表指令,输入输出指令在有关章节介绍。
除了SAHF和POPF指令外,这组指令对各标志没有影响。
1,传送指令其格式如下:MOV DST,SRC目的,源源操作数可以是累加器,寄存器,存储单元以及立即数,而目的操作数可以是累加器,寄存器和存储单元。
传送不改变源操作数。
传送指令能实现下列传送功能:(1) CPU内部寄存器之间的数据传送。
例如:MOV AH,ALMOV DL,DHMOV BP,SPMOV AX,CS注意:源和目的操作数不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP即不能作为源,也不能作为目的。
注意,这种例外永远存在。
(二)交换指令利用交换指令可方便地实现通用寄存器与通用寄存器或存储单间的数据交换,交换指令的格式如下:XCHG OPRD1,OPRD2此指令把操作数OPRD1R的内容与操作数OPRD2的内容交换。
操作数同时是字节或字。
例如:XCHG AL,AH; XCHG SI,BXOPRD1和OPRD2可是通用寄存器和存储单元。
但不包括段寄存器,也不能同时是存储单元,还不能有立即数,可采用各种存储器寻址方式来指定存储单元。
例如:XCHG BX,[BP+SI] 如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246)=4154H 物理地址=2F000+0200+0046=2F246H指令执行后:(BX)=4154H (2F246H)=6F36H此指令不影响标志位(三)地址传送指令80686/8088有如下三条地址传送指令。
汇编语言手册
汇编语言手册汇编语言是一种底层计算机语言,用于编写各种软件和驱动程序。
它与高级编程语言相比,更加接近计算机底层的硬件操作。
本手册旨在为使用汇编语言编程的开发人员提供详细的参考和指南。
1. 汇编语言的基础知识汇编语言是一种基于机器语言的符号表示方法,通过将操作码和操作数转换为人可读的指令,实现与计算机底层硬件的交互。
首先,我们需要了解汇编语言的基本概念和语法规则,包括寄存器、内存、指令和操作数的使用方法等。
2. 汇编语言的数据类型和指令在汇编语言中,有多种数据类型和指令可以使用。
常见的数据类型包括字节、字、双字和四字等。
指令则用于执行各种操作,如算术运算、逻辑运算和数据传输等。
在本节中,我们将详细介绍常用的数据类型和指令的使用方法和注意事项。
3. 汇编语言的程序结构汇编语言编程通常采用的是过程式的编程方法,即通过定义和调用过程来组织代码。
程序结构的良好设计对于代码的可读性和维护性至关重要。
本节将介绍如何定义和调用过程、使用标签和跳转指令来实现程序的跳转和分支。
4. 汇编语言的输入输出输入输出是任何程序的必要部分。
在汇编语言中,我们通过各种输入输出指令来实现与外部设备的交互。
例如,可以使用键盘输入数据、从内存中读取数据、将数据输出到屏幕或保存到文件等。
本节将介绍如何使用输入输出指令完成常见的输入输出任务。
5. 汇编语言的调试和优化调试和优化是程序开发过程中不可或缺的环节。
在本节中,我们将介绍如何使用调试工具和技术,如断点调试、寄存器跟踪和内存监视等,来定位和修复程序中的错误。
另外,我们还将探讨如何通过代码重构和性能优化等方式提高程序的效率和质量。
6. 汇编语言的应用领域汇编语言虽然底层和复杂,但在某些特定的应用领域中仍然有其存在的价值。
比如,嵌入式系统开发、驱动程序编写和逆向工程等都需要掌握一定的汇编语言知识。
本节将简要介绍几个常见的应用领域,并提供相关的实例和参考资料。
总结:本手册提供了关于汇编语言的详细参考和指南。
汇编语言基础手册
汇编语言基础手册第一章概述汇编语言是一种低级语言,用于直接操作计算机硬件。
本手册将介绍汇编语言的基础知识和常用指令,帮助读者快速入门汇编语言编程。
第二章寄存器寄存器是汇编语言中最基本的数据存储单元,用于存储和处理数据。
本章将介绍汇编语言中常用的通用寄存器、段寄存器和特殊寄存器,并讲解它们的用途和操作方法。
第三章指令汇编语言的指令是用于完成各种操作的命令,例如数据传送、运算和控制等。
本章将详细介绍常用的数据传送指令、算术指令和逻辑指令,并提供相关的示例代码,帮助读者理解和应用。
第四章内存操作汇编语言中,内存是用于存储数据和指令的重要部分。
本章将介绍如何使用汇编语言进行内存的读取、写入和操作,并提供实际案例来演示内存操作的应用。
第五章程序控制程序控制是汇编语言中的核心内容,用于控制程序的流程和执行顺序。
本章将详细介绍条件转移、循环和子程序等程序控制结构,并提供实例代码以及相应的调试技巧。
第六章 I/O操作汇编语言可以通过输入和输出操作与外部设备进行通信。
本章将介绍如何使用汇编语言进行键盘输入和屏幕输出,并提供相应的示例代码和调试方法,使读者能够灵活运用I/O操作。
第七章常见问题与调试技巧本章将列举一些常见的汇编语言编程问题,并给出相应的解决方案和调试技巧。
读者可以通过学习这些问题和技巧,提高自己的编程能力和问题排除能力。
第八章汇编语言应用本章将介绍汇编语言在实际应用中的一些常见场景,包括操作系统开发、驱动程序编写和嵌入式系统设计等。
读者可以了解到汇编语言的实际用途,并借鉴相关案例来进行实际项目开发。
结语汇编语言是一门重要而底层的编程语言,对于理解计算机系统和进行系统级编程具有重要意义。
通过学习本手册,读者可以掌握汇编语言的基础知识和编程技巧,为进一步深入学习和应用打下坚实基础。
注:本手册基于x86架构进行讲解,部分指令和操作可能在其他架构中有所不同。
读者在实际应用中应结合具体环境和需求进行相应调整和学习。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
寄存器与存储器1. 寄存器功能. 寄存器的一般用途和专用用途. CS:IP 控制程序执行流程. SS:SP 提供堆栈栈顶单元地址. DS:BX(SI,DI) 提供数据段内单元地址. SS:BP 提供堆栈内单元地址. ES:BX(SI,DI) 提供附加段内单元地址. AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。
. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。
2. 存储器分段管理. 解决了16位寄存器构成20位地址的问题. 便于程序重定位. 20位物理地址=段地址* 16 + 偏移地址. 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。
3. 堆栈. 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。
. 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。
.堆栈总是以字为单位存取指令系统与寻址方式1. 指令系统. 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。
执行指令后,一般源操作数不变,目的操作数被计算结果替代。
. 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。
2. 寻址方式. 寻址方式确定执行指令时获得操作数地址的方法. 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。
. 与数据有关的寻址方式的一般用途:(1) 立即数寻址方式--将常量赋给寄存器或存储单元(2) 直接寻址方式--存取单个变量(3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度(4) 寄存器间接寻址方式--访问数组元素(5) 变址寻址方式(6) 基址变址寻址方式(7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素. 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP. 与转移地址有关的寻址方式的一般用途:(1) 段内直接寻址--段内直接转移或子程序调用(2) 段内间接寻址--段内间接转移或子程序调用(3) 段间直接寻址--段间直接转移或子程序调用(4) 段间间接寻址--段间间接转移或子程序调用汇编程序和汇编语言1. 汇编程序. 汇编程序是将汇编语言源程序翻译成二进制代码程序的语言处理程序,翻译的过程称为汇编。
2. 汇编语言. 汇编语言是用指令助记符,各种标识变量,地址,过程等的标识符书写程序的语言, 汇编语言指令与机器指令一一对应。
. 伪指令,宏指令不是由CPU执行的指令,而是由汇编程序在汇编期间处理的指令。
. 伪指令指示汇编程序如何完成数据定义,存储空间分配,组织段等工作。
. 宏指令可简化程序并减少程序书写量。
. 条件汇编伪指令的功能是确定是否汇编某段源程序,而不是实现程序分支,对未汇编的程序将不产生相应的目标代码。
. 结构作为一种数据结构可将一组类型不同但有逻辑关联的数据组织在一起,便于整体处理数据。
. 记录可用于提高存储单元的利用率,将若干不足一个字节或字且有逻辑关联的信息压缩存放在一个字节或字中。
. 指令中的表达式在汇编期间计算,并且只能对常量或地址进行计算。
程序设计基础1. 分支程序设计. 程序分支由条件转移指令或无条件转移指令实现. 存放若干目的转移地址或跳转指令的跳转表常用于实现多路分支. 条件转移指令只能实现偏移量为-128至+127字节范围的转移. 无条件转移指令根据寻址方式可实现短转移(偏移量为-128至+127字节),段内转移,段间转移。
2. 循环程序设计. 可由循环控制指令或条件转移指令组织循环结构. 内层循环结构必须完全包含在外层循环结构内,并不能发生从循环结构外向循环结构内的转移。
3. 子程序设计. 子程序中应保护寄存器内容,并正确使用堆栈, 成对执行PUSH和POP指令,保证执行RET指令时堆栈栈顶为返回地址。
. 主程序可通过寄存器,参数表,或堆栈传递参数给子程序4. EXE文件和COM文件. 二者都是可执行文件. COM文件源程序的特点是: 第一条可执行指令的起始存放地址必须是100H,不能分段,不用定义堆栈,所有过程为NEAR类型,直接用INT 20H 指令返回DOS。
5. DOS功能调用与BIOS中断调用. 二者都是完成DOS系统提供给用户的输入/输出等常用功能,通过执行软中断指令完成一次软中断服务。
. DOS功能调用的中断服务程序是操作系统的一部分,存于RAM中; 而BIOS中断调用的中断服务程序存放在ROM中。
输入/输出与中断系统1. 输入/输出的方式. 程序直接I/O方式: 用IN和OUT指令直接在端口级上进行I/O操作,数据传送方式分为无条件传送方式和查询传送方式。
. 中断传送方式: 由CPU响应中断请求完成中断服务。
. DMA传送方式: 直接在存储器与外设之间传送数据。
2. 有关中断的概念. 中断、中断源、中断请求、中断服务、中断向量、中断向量表、中断响应过程、中断指令、开中断、关中断、内部中断、外部中断、可屏蔽中断、非屏蔽中断。
3. 键盘I/O、显示器I/O操作. 键盘的输入操作用BIOS的16H中断调用控制,也可直接访问60H端口(数据端口), 61H端口(状态端口)检测键盘的按键操作。
. 对于特殊键(如Shift , Ctrl , Alt , NumLock , ScrollLock等键)的按动情况,可以直接从来40:17H单元取得有关信息。
. 显示器的图形显示可以用BIOS的10H中断调用实现,另一种速度更快的方法是直接读写视频缓冲区。
4. 打印机I/O操作由INT 17H中断调用实现,串行通讯口操作由INT 14H中断调用实现。
CLD Clear the direction flag (set to forward direction)将方向标志置0,使si和di增量,串处理从低地址向高地址处理8088 汇编速查手册一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.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标志出栈.PUSHD32位标志入栈.POPD32位标志出栈.二、算术运算指令ADD 加法.ADC带进位加法.INC加1.AAA加法的ASCII码调整.DAA加法的十进制调整.SUB减法.SBB带借位减法.DEC减1.NEC求反(以0 减之).CMP比较.(两操作数作减法,仅修改标志位,不回送结果).AAS减法的ASCII码调整.DAS减法的十进制调整.MUL无符号乘法.IMUL整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM乘法的ASCII码调整.DIV无符号除法.IDIV整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD除法的ASCII码调整.CBW字节转换为字. (把AL中字节的符号扩展到AH中去)CWD字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ双字扩展.(把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令AND与运算.OR或运算.XOR异或运算.NOT取反.TEST测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL逻辑左移.SAL算术左移.(=SHL)SHR逻辑右移.SAR算术右移.(=SHR)ROL循环左移.ROR循环右移.RCL通过进位的循环左移.RCR通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码.如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL 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程序结束.汇编语言基础知识汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机)============================x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:1. 通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途) 这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器. EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址. ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器. EDX是...(忘了..哈哈)但它总是被用来放整数除法产生的余数. 这4个寄存器的低16位可以被单独访问,分别用AX,BX,CX和DX. AX又可以单独访问低8位(AL)和高8位(AH), BX,CX,DX也类似. 函数的返回值经常被放在EAX中.ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:push ebp ;保存当前ebpmov ebp,esp ;EBP设为当前堆栈指针sub esp, xxx ;预留xxx字节给函数临时变量....这样一来,EBP 构成了该函数的一个框架, 在EBP上方分别是原来的EBP, 返回地址和参数. EBP下方则是临时变量. 函数返回时作mov esp,ebp/pop ebp/ret 即可.ESP 专门用作堆栈指针.2. 段寄存器:CS(Code Segment,代码段) 指定当前执行的代码段. EIP (Instruction pointer, 指令指针)则指向该段中一个具体的指令. CS:EIP指向哪个指令, CPU 就执行它. 一般只能用jmp, ret, jnz, call 等指令来改变程序流程,而不能直接对它们赋值.DS(DATA SEGMENT, 数据段) 指定一个数据段. 注意:在当前的计算机系统中, 代码和数据没有本质差别, 都是一串二进制数, 区别只在于你如何用它. 例如, CS 制定的段总是被用作代码, 一般不能通过CS指定的地址去修改该段. 然而,你可以为同一个段申请一个数据段描述符"别名"而通过DS来访问/修改. 自修改代码的程序常如此做.ES,FS,GS 是辅助的段寄存器, 指定附加的数据段.SS(STACK SEGMENT)指定当前堆栈段. ESP 则指出该段中当前的堆栈顶. 所有push/pop 系列指令都只对SS:ESP指出的地址进行操作.3. 标志寄存器(EFLAGS):该寄存器有32位,组合了各个系统标志. EFLAGS一般不作为整体访问, 而只对单一的标志位感兴趣. 常用的标志有:进位标志C(CARRY), 在加法产生进位或减法有借位时置1, 否则为0.零标志Z(ZERO), 若运算结果为0则置1, 否则为0符号位S(SIGN), 若运算结果的最高位置1, 则该位也置1.溢出标志O(OVERFLOW), 若(带符号)运算结果超出可表示范围, 则置1.JXX 系列指令就是根据这些标志来决定是否要跳转, 从而实现条件分枝. 要注意,很多JXX 指令是等价的, 对应相同的机器码. 例如, JE 和JZ 是一样的,都是当Z=1是跳转. 只有JMP 是无条件跳转. JXX 指令分为两组, 分别用于无符号操作和带符号操作. JXX 后面的"XX" 有如下字母:无符号操作: 带符号操作:A = "ABOVE", 表示"高于" G = "GREATER", 表示"大于"B = "BELOW", 表示"低于" L = "LESS", 表示"小于"C = "CARRY", 表示"进位"或"借位" O = "OVERFLOW", 表示"溢出"S = "SIGN", 表示"负"通用符号:E = "EQUAL" 表示"等于", 等价于Z (ZERO)N = "NOT" 表示"非", 即标志没有置位. 如JNZ "如果Z没有置位则跳转"Z = "ZERO", 与E同.如果仔细想一想,就会发现JA = JNBE, JAE = JNB, JBE = JNA, JG = JNLE, JGE= JNL, JL= JNGE, ....4. 端口端口是直接和外部设备通讯的地方。