汇编语言手册

合集下载

汇编指令手册

汇编指令手册

计算机寄存器常用指令
一、常用指令
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汇编语言是一种基于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. 单步执行在调试汇编语言程序时,可以使用单步执行功能逐条执行并观察每条指令的结果,帮助定位错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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. 端口端口是直接和外部设备通讯的地方。

相关文档
最新文档