win32常用的汇编指令,寄存器
16位与32位汇编语言常用指令总结
16位与32位汇编语言常用指令总结在计算机编程领域,汇编语言被广泛应用于底层程序设计,直接操作计算机硬件。
其中,16位和32位汇编语言是常见的两种类型。
本文将总结这两种汇编语言中常用的指令,帮助读者更好地理解和应用它们。
一、16位汇编语言常用指令1. 数据传送指令- MOV:将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
- XCHG:交换两个寄存器或内存位置的数据。
2. 算术运算指令- ADD/SUB:实现加法和减法运算。
- MUL/IMUL:实现无符号与有符号乘法运算。
- DIV/IDIV:实现无符号与有符号除法运算。
3. 逻辑运算指令- AND/OR/XOR:实现与、或、异或逻辑运算。
- NOT:对操作数进行按位取反操作。
4. 条件转移指令- JMP:无条件跳转到指定地址。
- JZ/JNZ:根据零标志位(ZF)的值进行跳转。
- JC/JNC:根据进位标志位(CF)的值进行跳转。
5. 循环指令- LOOP:根据计数器的值进行循环。
- JCXZ/JECXZ:根据CX/ECX寄存器的值进行循环。
二、32位汇编语言常用指令1. 数据传送指令- MOV:同16位汇编语言中的指令,用于数据传送。
- PUSH/POP:将数据推入栈或从栈中弹出。
2. 算术运算指令- ADD/SUB:同16位汇编语言中的指令,用于加法和减法运算。
- MUL/IMUL:同16位汇编语言中的指令,用于乘法运算。
- DIV/IDIV:同16位汇编语言中的指令,用于除法运算。
3. 逻辑运算指令- AND/OR/XOR:同16位汇编语言中的指令,用于逻辑运算。
- NOT:同16位汇编语言中的指令,用于按位取反。
4. 条件转移指令- JMP:同16位汇编语言中的指令,用于无条件跳转。
- JZ/JNZ:同16位汇编语言中的指令,根据零标志位(ZF)进行跳转。
- JB/JNB:根据低位借位标志位(CF)进行跳转。
5. 循环指令- LOOP:同16位汇编语言中的指令,用于循环操作。
WIN32汇编
Windows版本我们也可以建一个Windows版的Hello World!程序。
将下面的代码粘贴到文本编辑器中并保存为“Hellow.asm”。
.386.model flat, stdcalloption casemap :noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\user32.incincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\user32.lib.dataHelloWorld db "Hello World!", 0.codestart:invoke MessageBox, NULL, addr HelloWorld, addr HelloWorld, MB_OKinvoke ExitProcess, 0end start现在,再次打开命令行并进入到保存“Hellow.asm”的目录里。
输入"\masm32\bin\ml /c /Zd /coff hellow.asm"。
然后再输入“\masm32\bin\Link /SUBSYSTEM:WINDOWS hellow.obj”,注意参数中的subsystem选项又原来的CONSOLE替换成了WINDOWS。
这个程序将会弹出一个对话框来显示“Hello World!”。
Windows版本和控制台版本仅仅有3行代码不同。
首先两处更改的是为了我们现在能使用MessageBox函数来替换之前的StdOut,必须加入user32的包含文件和库文件。
第三个改变就是使用MessageBox函数来替换StdOut函数。
完了,就这些。
ADDR vs OFFSET在我们的Hello World!例子中,我们使用了‘addr’来获取“Hello World”字符串的地址。
win32汇编语言
win32汇编语言Win32汇编语言是一种低级别的程序语言,用于开发应用程序和操作系统。
它是一种基于 x86 架构的汇编语言,可直接访问计算机硬件。
在本文中,将介绍一些常见的Win32汇编语言的基本知识和参考内容。
首先,了解如何在Win32汇编语言中使用寄存器是非常重要的。
在x86架构中,有许多寄存器可用于存储数据和执行运算。
其中包括通用寄存器(如EAX、EBX、ECX、EDX)和特殊用途寄存器(如EIP、ESP、EBP)。
了解如何正确使用这些寄存器对于编写高效和可靠的汇编代码至关重要。
其次,学习如何使用Win32 API函数是编写Win32汇编语言程序所必需的。
Win32 API是一组函数和接口,用于与Windows操作系统进行交互。
通过调用这些函数,可以执行各种任务,如创建窗口、处理消息、操作文件等。
了解如何使用这些函数,可以使程序获得更多的功能和灵活性。
此外,了解如何操作内存也是编写Win32汇编语言程序所必需的。
在程序运行时,需要使用内存来存储和操作数据。
了解如何分配和释放内存,以及如何使用不同的内存段(如堆栈和数据段)是非常重要的。
同时,了解如何进行内存读写操作,如移动数据、复制数据等,也是编写高效程序所必需的技能。
另外,学习如何处理异常和错误也是非常重要的。
在编写程序时,难免遇到各种错误和异常情况。
了解如何正确处理这些错误和异常,可以使程序更加健壮和可靠。
Win32 API提供了一些处理错误和异常的函数和接口,如SetLastError和GetLastError等。
最后,了解如何进行调试和优化是编写Win32汇编语言程序的关键。
在程序开发过程中,经常需要进行调试和优化,以确保程序的正确性和性能。
Win32汇编语言提供了一些调试和优化工具,如调试器和性能分析器等。
了解如何使用这些工具可以帮助程序员更快地定位和解决问题,提高程序的执行效率。
综上所述,了解如何使用寄存器、Win32 API函数、内存操作、异常处理以及调试和优化工具是编写Win32汇编语言程序的基本要点。
第三章 Win32汇编语言-汇编语言程序设计基础-指令系统
2012-6-8
19
.code start: ; 内存不内存之间的数据交换 mov ax,val1 ; AX = 1000h xchg ax,val2 ; AX = 2000h, val2 = 1000h mov val1,ax ; val1 = 2000h
2012-6-8
20
; 字节数组访问 mov al,arrayB ; AL = 10h mov al,[arrayB+1] ; AL = 20h mov al,[arrayB+2] ; AL = 30h ; 字数组访问 mov ax,arrayW ; AX = 100h mov ax,[arrayW+2] ; AX = 200h
的操作数时,溢出标志OF置1
2012-6-8
32
迚位不溢出标志
加法:
和的最高有效位
他,CF=0; 两个操作数符号相同,而结果符号不之相反, OF=1;其他,OF=0;
有 向高位的迚位,CF=1;其
减法:
被减数的最高有效位
其他,CF=0; 两个操作数符号相反,而结果的符号不减数相 同,OF=1;其他,OF=0;
lea
CPU指令
标号/变量、表达式
offset
伪指令
标号、变量
一般来说, mov reg, offset xxx 比 lea reg,xxx 的 指令长度少一个字节,丏快一个时钟, 但 lea 更灵活
2012-6-8
17
2012-6-8
18
综合实例
.386 .model flat, stdcall .data val1 WORD 1000h val2 WORD 2000h arrayB BYTE 10h,20h,30h,40h,50h arrayW WORD 100h,200h,300h arrayD DWORD 10000h,20000h
win32汇编MessageBox
win32汇编MessageBox32位处理器环境的段寄存器:内存描述符表的段选择⼦简单的代码:.386 ;使⽤的指令集.model flat, stdcall ;内存模型和默认的函数调⽤约定,后续proc和proto如果没写约定,就⽤此处默认的option casemap:none ;⼤⼩写敏感MessageBox equ MessageBoxAMessageBoxA proto : DWORD, : DWORD, : DWORD, : DWORD ;声明要调⽤的函数,链接时要加user32.lib选项.data ;数据段,可读可写.const ;只读数据段,只读g_szHello db 'Hello World', 0g_szTitle db 'The Title', 0.data? ;未初始化数据段,可读可写.code ;代码段,可读可执⾏start:push 0push offset g_szTitlepush offset g_szHellopush 0call MessageBoxretend start编译:ml /c /coff main.asm链接:link32 /subsystem:windows main.obj user32.lib简化版:.386 ;使⽤的指令集.model flat, stdcall ;内存模型和默认的函数调⽤约定,后续proc和proto如果没写约定,就⽤此处默认的option casemap:none ;⼤⼩写敏感include windows.incinclude user32.incincludelib user32.lib.data ;数据段,可读可写.const ;只读数据段,只读g_szHello db 'Hello World', 0g_szTitle db 'The Title', 0.data? ;未初始化数据段,可读可写.code ;代码段,可读可执⾏start:invoke MessageBox, NULL, offset g_szHello, addr g_szTitle, MB_OK retend startOD:查看-记录可以看记录。
Win32汇编语言-寻址方式
esi=00404000
[00404004]=05h
2020/9/12
21
2020/9/12
21
例:mov esi, array_end
直接寻址
array_end equ $-1 ;$=00404007 ;array_end=00404007-1
=00404006
寻址方式
宋军 计算机学院信息安全系
songjun@
2020/9/12
1
寻址方式
操作数的寻址方式
立即数寻址 寄存器寻址 存储器寻址
直接寻址 间接寻址 相对寻址
2020/9/12
2
立即数寻址
操作数在指令中给出
指令格式: MOV AL, 5 MOV AX, 3064H MOV AL, ‘A’
2020/9/12
18
例:mov esi, offset array
直接
寻址
array的 地址
2020/9/12
19
2020/9/12
19
例:mov al, [esi]
寄存器间接 寻址
esi=00404000
地址00404000的 内容
2020/9/12
20
2020/9/12
20
例:mov al, [esi+4]
.code
mov esi, offset W1
mov ax, [esi]
; 1234h
add esi, 2
add ax, [esi]
; 1234h + 5678h
add esi, 2
add ax, [esi]
; 1234h + 5678h + 4321h
win32汇编除法
win32汇编除法1. 简介win32汇编是一种低级编程语言,用于在Windows操作系统上编写应用程序。
在win32汇编中,除法操作是非常常见的,它允许将两个数相除并得到商和余数。
本文将介绍win32汇编中的除法操作,包括如何使用除法指令、处理异常和处理特殊情况。
2. 除法指令win32汇编提供了两个除法指令:div和idiv。
•div指令用于无符号整数的除法操作。
它使用eax寄存器作为除数,并将商存储在eax中,余数存储在edx中。
•idiv指令用于有符号整数的除法操作。
它使用eax寄存器作为除数,并将商存储在eax中,余数存储在edx中。
以下是一个示例程序,展示如何在win32汇编中使用除法指令:mov eax, 10 ; 设置除数mov ebx, 3 ; 设置被除数div ebx ; 无符号整数除法; 此时 eax = 3(商),edx = 1(余数)idiv ebx ; 有符号整数除法; 此时 eax = -3(商),edx = 1(余数)3. 处理异常在进行除法操作时,可能会出现一些异常情况,例如被除数为0或除数与被除数的符号不同。
为了处理这些异常,win32汇编提供了一些标志位。
•CF(Carry Flag)标志位用于指示除法操作是否溢出。
如果除数为0,则CF会被设置为1。
•ZF(Zero Flag)标志位用于指示商是否为0。
如果商为0,则ZF会被设置为1。
以下是一个处理除法异常的示例程序:mov eax, 10 ; 设置除数mov ebx, 0 ; 设置被除数为0div ebx ; 无符号整数除法jnc success ; 如果没有溢出,跳转到成功处理的标签; 处理除法异常的代码; ...success:; 处理除法成功的代码; ...4. 处理特殊情况除法操作还涉及一些特殊情况的处理。
例如,当进行除法操作时,如果商的结果无法放入指定的寄存器,会导致溢出。
为了处理这种情况,可以使用cwd指令将32位有符号整数转换为64位有符号整数。
第三章 Win32汇编语言汇编语言程序设计基础指令系统PPT课件
16
LEA 与 OFFSET
buffer db 100 dup(0)
;把字节变量buffer的EA传送给EBX
lea ebx, buffer
√
mov ebx, offset buffer √
buffer db 100 dup(0) lea ebx, [buffer+50] √ mov ebx, offset [buffer+50] ;X
2020/11/17
10
MOVZX / MOVSX
将源操作数的内容拷贝到目 的操作数中
MOVZX(move with zero-extend) 将该值零扩展至16位或32位
MOVSX(move with sign-extend) 将该值符号扩展至16位或32 位
目的操作数必须是寄存器
例:MOVSX EAX,CL MOVSX EDX,[EDI]
IA-32CPU指令系统包括:
① 通用指令 ② 浮点运算指令 ③ SIMD指令 ④ MMX指令(多媒体扩展指令集 ) ⑤ SSE/SSE2/SSE3指令(单指令多数据流扩展 ) ⑥ 系统指令 ⑦ 64位模式的指令
2020/11/17
3
通用指令集合
① 数据传送类指令 ② 算术运算类指令 ③ 位操作类指令 ④ 串操作类指令 ⑤ 控制转移类指令 ⑥ 处理机控制类指令 ⑦ 其他类
注意:不是获取存储器单元的内容
2020/11/17
15Βιβλιοθήκη 有效地址传送指令LEA将存储器操作数的有效地址传送至指定的 寄存器中。
在实模式下,使用16位寄存器 在保护模式下,使用32位寄存器
该指令通常用来对指针或变址寄存器EBX、 EDI或ESI等置初值之用。
windows环境下32位汇编语言程序设计附书代码
windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
汇编指令大全+很全的汇编指令
for Addition)
1. 调整操作如下
格式: DAA
(1) 若(AL) and 0FH>9 或 AF=1
,则(AL)<--(AL)+6,AF<--1,对低
功能: 对AL中的两个组合进制数相加的结果进行调 四位的调整.
整,调整结果仍放在AL中,进位标志放在CF中.
(2) 若(AL) and 0F0H>90H 或
OPRD2为立即数,也可以是任意一 个通用寄存器操作数.立即数只 能用于源操作数.
2. OPRD1和OPRD2均为寄存器是 允许的,一个为寄存器而另一个 为存储器也是允许的, 但不允许 两个都是存储器操作数.
3. 加法指令运算的结果对CF、 SF、OF、PF、ZF、AF都会有影 响.以上标志也称为结果标志.加 法指令适用于无符号数或有符号 数的加法运算. 说明:
作数OPRD2与目的操数OPRD1交换.
2. 段寄存器内容不能用XCHG指
令来交换.
3. 若要实现两个存储器操作数 DATA1及DATA2的交换,可用以下 指令实现: 示例: PUSH DATA1
页码,1/22
星尘-易尘
PUSH DATA2 POP DATA1 POP DATA2
5 XLAT 查表指令 XLAT
注意: 上面LDS DI,[BX]指令的 功能是把BX所指的32位地址指针 的段地址送入DS,偏移地址送入
页码,2/22
星尘-易尘
12 LES
从存储器取出32位地址的指令 LES 格式: LES OPRD1,OPRD2 功能: 从存储器取出32位地址的指令.
13 ADD
加法指令 ADD(Addition) 格式: ADD OPRD1,OPRD2 功能: 两数相加
Win32汇编语言-概述.
汇编语言程序设计
最古老的程序设计语言
深入理解计算机体系结构和操作系统
高级汇编语法
2018/9/15
,MASM,TASM接近MASM
6
什么是汇编语言
汇编语言是一种面向机器的低级程序设计语言 汇编语言以助记符形式表示每一条计算机指令 助记符:易记忆、描述指令功能和指令操作数 汇编指令:用助记符表示的指令 汇编语言:汇编格式指令、编写规则 汇编程序:称汇编语言源程序(.ASM)
使用助记符的语句 汇编指令与机器指令
语言,纯粹的数字形式 特定的处理器才能理解
一一对应
2018/9/15
11
汇编语言与高级语言
高级语言与汇编语言及机器语言是一对多 的关系
一条简单的C语言会被扩展成多条汇编语言或
机器语言指令
x = ( y + 4 )*3 mov add mov imul mov
2018/9/15
7
编译和调试环境
编辑器、编译器、链接器和调试器
编辑器创建源文件,如文本或代码编辑器 编译器把汇编源程序转换为二进制目标文件 链接器是把编译器创建的多个单独的文件组合 链 接成可执行文件 调试器查看程序运行中寄存器和内存状态
.ASM .OBJ .EXE
编辑器
编译器
链接器
虚拟机VM1(L1)程序在虚拟机VM0(L0) 执行,例如Java虚拟机(JVM)
24
2018/9/15
虚拟机层次
高级语言 5th 汇编语言 4th 操作系统 3th
指令集体系结构 2nd
C++,C#,Java等,翻译为第4层 翻译为第2层;中断在第3层
32位汇编指令
32位CPU所含有的寄存器有:4个数据寄存器(E AX、EB X、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(E SP和EB P)6个段寄存器(ES、C S、SS、DS、FS和GS)1个指令指针寄存器(EIP)1个标志寄存器(EF lags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和E DX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、C X和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:B H-BL、CX:CH-CL、D X:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Acc umula tor),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(B ase R egist er)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Co unt R egist er)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Da ta Re giste r)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
32位汇编入门知识
32位汇编入门知识简介:汇编语言是一种低级语言,它直接表达了计算机的指令和数据。
本文将介绍32位汇编语言的入门知识,包括寄存器、指令、堆栈和函数调用等内容。
一、寄存器寄存器是CPU内部用来存储和操作数据的部件,32位汇编语言中常用的寄存器有EAX、EBX、ECX、EDX等。
每个寄存器都有特定的用途,例如EAX通常用于存放函数返回值,EBX通常用于存放基址。
二、指令指令是汇编语言中最基本的单位,它表示一条计算机指令。
常见的指令有MOV、ADD、SUB等。
例如,MOV指令用于将数据从一个地方移动到另一个地方,ADD指令用于进行加法运算。
三、堆栈堆栈是用于存储临时数据的一种数据结构,它具有“先进后出”的特点。
在汇编语言中,堆栈用于保存函数的局部变量、函数参数和返回地址等信息。
例如,PUSH指令用于将数据压入堆栈,POP指令用于将数据从堆栈中弹出。
四、函数调用函数调用是程序中常见的操作,它用于实现代码的模块化。
在汇编语言中,函数调用通常需要进行参数传递和返回值处理。
例如,CALL 指令用于调用函数,RET指令用于从函数返回。
五、例子下面通过一个简单的例子来演示32位汇编语言的使用:```assemblysection .datamsg db 'Hello, World!', 0section .textglobal _start_start:; 输出字符串mov eax, 4mov ebx, 1mov ecx, msgmov edx, 13int 0x80; 退出程序mov eax, 1xor ebx, ebxint 0x80```这是一个输出"Hello, World!"的程序。
首先将字符串存储在.data节中的msg变量中。
然后在.text节中定义了一个入口点_start,通过将相关参数设置到寄存器中,调用系统调用int 0x80来实现输出和退出。
六、总结本文介绍了32位汇编语言的入门知识,包括寄存器、指令、堆栈和函数调用等内容。
WIN32汇编程序
将立即数压入堆栈
PUSH i8/i16/i32
;把16位或32位立即数i16/i32压入堆栈。若是8 位立即数i8,经符号扩展成16位后再压入堆栈
push 1234h push 87654321h call helloabc add esp,6
;压入16位立即数 ;压入16位立即数 ;平衡堆栈
Win32汇编程序设计
• 整数指令集
– 16位整数指令集 – 32位整数指令集 在 16 指 令 基 础 上 形 成 的
• 浮点指令集 • MMX指令集 • SSE指令集 • SSE2指令集 • SSE3指令集
32 位 整 数 指 令 集
主 要 指 令 集
一、 32位指令的运行环境
实地址方式 保护方式 虚拟8086方式 16位逻辑段:段地址和偏移地址都是16位
qvar
start1:
mov ecx,8 shl eax,1 rcl edx,1 loop start1 mov dword ptr qvar,eax mov dword ptr qvar[4],edx .exit 0 end
例4
.model small .386 ;采用32位指令 .stack .data equ 10 dd 20,4500h,3f40h,-1,7f000080h dd 81000000h,0fffffff1h dd -45000011,12345678 dd 87654321 .code .startup
然后对那一位置位 bt eax,5 ;EAX=12345678h,CF←1=EAX的D5位 btc eax,10 btr eax,20 bts eax,34 ;EAX=12345278h,CF←1=EAX的D10位 ;EAX=12245278h,CF←1=EAX的D20位 ;EAX=1224527Ch,CF←0=EAX的D2位
学Win32汇编[28]-跳转指令:JMP、JECXZ、JA、JB、JG、JL、JE、JZ。。。
学Win32汇编[28]-跳转指令:JMP、JECXZ、JA、JB、JG、JL、JE、JZ。
跳转指令分三类:⼀、⽆条件跳转: JMP;⼆、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.根据标志位跳转的指令:JE ;等于则跳转JNE ;不等于则跳转JZ ;为 0 则跳转JNZ ;不为 0 则跳转JS ;为负则跳转JNS ;不为负则跳转JC ;进位则跳转JNC ;不进位则跳转JO ;溢出则跳转JNO ;不溢出则跳转JA ;⽆符号⼤于则跳转JNA ;⽆符号不⼤于则跳转JAE ;⽆符号⼤于等于则跳转JNAE ;⽆符号不⼤于等于则跳转JG ;有符号⼤于则跳转JNG ;有符号不⼤于则跳转JGE ;有符号⼤于等于则跳转JNGE ;有符号不⼤于等于则跳转JB ;⽆符号⼩于则跳转JNB ;⽆符号不⼩于则跳转JBE ;⽆符号⼩于等于则跳转JNBE ;⽆符号不⼩于等于则跳转JL ;有符号⼩于则跳转JNL ;有符号不⼩于则跳转JLE ;有符号⼩于等于则跳转JNLE ;有符号不⼩于等于则跳转JP ;奇偶位置位则跳转JNP ;奇偶位清除则跳转JPE ;奇偶位相等则跳转JPO ;奇偶位不等则跳转跳转相关的标志位:11109876543210OF DF IF TF SF ZF AF PF CF溢出 符号零未⽤辅助未⽤奇偶未⽤进位JMP 测试; Test28_1.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib.codemain procPrintText '1'jmp @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend main;测试结果应该是:;1;4;以下都应该是这样. JE 测试; Test28_2.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'mov eax, 123 cmp eax, 123je @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJZ 测试; Test28_3.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'xor eax, eaxjz @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJS 测试; Test28_4.asm;.386.model flat, stdcallinclude windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'xor eax, eaxdec eaxjs @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJC 测试; Test28_5.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'mov al, 0FFhadd al, 1jc @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJO 测试; Test28_6.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'mov al, -128sub al, 1jo @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJA 测试; Test28_7.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'mov eax, 22cmp eax, 11ja @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJG 测试; Test28_8.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'mov eax, 1cmp eax, -1jg @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJP 测试; Test28_9.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'mov al, 00001110b inc aljp @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend mainJECXZ 测试; Test28_10.asm;.386.model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .codemain procPrintText '1'xor ecx, ecx jecxz @FPrintText '2'PrintText '3'@@: PrintText '4'retmain endpend main。
汇编语言常用指令大全解释
汇编语言常用指令大全解释汇编语言常用指令大全解释常用汇编指令:MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
【汇编语言】32位指令及其编程(可编辑)
封面第六章 32位指令及其编程第六章32位指令及其编程概述 6.1 32位指令运行环境6.2 32位扩展指令 6.3 32位指令的程序设计 6.4 32位新增指令 6.5 用汇编语言编写 32位WINDOWS应用程序概述1 概述 32位指令系统以80386 CPU 为基础,其指令集可分为整数指令集(16位整数指令集、32位整数指令集)和浮点指令集,16位整数指令集全兼容8086 CPU。
1996年,Intel推出MMX Pentium,首次增加了MMX (多媒体扩展)指令集,提高了CPU对多媒体数据的处理能力。
1999年,Intel推出Pentium Ⅲ,增加了SSE指令集(数据流SIMD扩展指令,SIMD为MMX指令集的关键技术,意为“单指令流多数据流”)。
2000年,Intel推出Pentium4,又增加SSE2指令集,增强了处理器对3-D图象、视频编码解码、语音识别等数据的处理能力。
概述2 本章主要介绍80386的32位整数指令集,及其汇编语言程序设计,对386以后推出的CPU新增指令(0>.、 .、.)简单介绍。
6.5 节简单介绍如何使用汇编语言编写WINDOWS应用程序。
本章应重点掌握: 32位编程环境 32位寻址方式 32位指令编程方法 6.1 32位指令运行环境 6.1 32位指令运行环境补充.386的工作方式及16位段和32位段 . 寄存器组 . 寻址方式 .机器代码格式 386的工作方式:实方式补充 386的工作方式实地址方式:实方式(Real Mode)与8086/80186的工作方式以及80286的实地址方式具有相同的基本结构。
不使用386的优先级分级制,所有程序(DOS和应用程序都工作在0级(特权级)。
32位x86 CPU只能寻址1MB物理存储器空间,分段最大64KB,采用16位逻辑段。
32位x86 CPU可以使用32位寄存器和32位操作数,也可以采用32位寻址方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
32位CPU所含有的寄存器有:
4个数据寄存器(EAX、EBX、ECX和EDX)对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
1个标志寄存器(EFlags)
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
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依次弹出堆栈.
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
PURGE -------------------- 解除语句
DUP -------------------- 操作数字段用复制操作符
2个变址和指针寄存器(ESI和EDI) 其低16位对应先前CPU中的SI和DI,对低16位数据的存取,不影响高16位的数据。寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
AND 与运算.
OR 或运算.
XOR 异或运算.
NOT 取反.
TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL 逻辑左移.
SAL 算术左移.(=SHL)
SHR 逻辑右移.
SAR 算术右移.(=SHR)
ROL 循环左移.
ROR 循环右移.
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
ADD 加法.
ADC 带进位加法.
INC 加 1.
AAA 加法的ASCII码调整.
DAA 加法的十进制调整.
SUB 减法.
SBB 带借位减法.
JB(或JNAE) opd --------------小于或者不大于等于则转移
JNB(或JAE) opd---------------不小于或者大于等于则转移
JA(或NJBE) OPD---------------大于或者不小于等于则转移
JNA(或JBE) OPD---------------不大于或者小于等于则转移
AAD 除法的ASCII码调整.
CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)
CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)
CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)
CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
逻辑运算指令
寄存器EAX通常称为累加器(Accumulator) 用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高;
寄存器EBX称为基地址寄存器(Base Register)它可作为存储器指针来使用;
寄存器ECX称为计数寄存器(Count Register) 在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;
4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
5、符号标志SF(Sign Flag)
符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。
汇编指令:常用
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
3、辅助进位标志AF(Auxiliary Carry Flag)
寄存器EDX称为数据寄存器(Data Register) 在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址
注意:在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,
在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,
JNP OPR --------------------结果为奇转移 , 测试条件SF=0
JC OPR -------------------- 有进位转移 , 测试条件SF=1
JNC OPR --------------------无进位转移, 测试条件SF=0
2.无符号比较条件转移指令(以下指令经常是CMP OPD,OPS后面的指令根据比较结果来实现转移)
2、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。
但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。
具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
EBP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据
ESP为堆栈指针(Stack Pointer)寄存器,用它只可DS、FS和GS)段寄存器 段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成
ESS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;
EFS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
EGS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
1个指令指针寄存器(EIP) 指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
CPU的指令系统中也有专门的指令来改变标志位IF的值。
3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。
JNS OPR---------------------结果为正转移, 测试条件SF=0
JO OPR--------------------- 溢出转移, 测试条件OF=
JNO OPR --------------------不溢出转移 , 测试条件SF=0
JP OPR ---------------------结果为偶转移, 测试条件SF=1
2个指针寄存器(ESP和EBP)其低16位对应先前CPU中的BP和SP,对低16位数据的存取,不影响高16位的数据。32位CPU有2个32位通用寄存器EBP和ESP。它们主要用于访问堆栈内的存储单元。寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
3.带符号比较条件转移指令
JL(或JNGE) --------------小于或者不大于等于则转移
JNL(或JGE)--------------不小于或者大于等于则转移
JG(或NJLE)---------------大于或者不小于等于则转移
JNG(或JLE)---------------不大于或者小于等于则转移
的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
CPU内部的段寄存器:
ECS——代码段寄存器(Code Segment Register),其值为代码段的段值;
EDS——数据段寄存器(Data Segment Register),其值为数据段的段值;
EES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;
RCL 通过进位的循环左移.
RCR 通过进位的循环右移.
程序转移指令
1.简单的条件转移指令
JZ(或jE) OPR---------------结果为零转移, 测试条件ZF=1
JNZ(或jNE) OPR --------------结果不为零转移,测试条件ZF=0