32位汇编语言
- 格式:ppt
- 大小:1.37 MB
- 文档页数:67
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位汇编语言中的指令,用于循环操作。
32位汇编入门知识汇编语言和CPU以及内存,端口等硬件知识是连在一起的. 这也是为什么汇编语言没有通用性的原因. 下面简单讲讲基本知识(针对INTEL x86及其兼容机) ============================x86汇编语言的指令,其操作对象是CPU上的寄存器,系统内存,或者立即数. 有些指令表面上没有操作数, 或者看上去缺少操作数, 其实该指令有内定的操作对象, 比如push指令, 一定是对SS:ESP指定的内存操作, 而cdq的操作对象一定是eax / edx.在汇编语言中,寄存器用名字来访问. CPU 寄存器有好几类, 分别有不同的用处:1. 通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP(这个虽然通用,但很少被用做除了堆栈指针外的用途)这些32位可以被用作多种用途,但每一个都有"专长". EAX 是"累加器"(acc umulator), 它是很多加法乘法指令的缺省寄存器. 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 po inter, 指令指针)则指向该段中一个具体的指令. 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. 端口端口是直接和外部设备通讯的地方。
基于汇编语言的32位二进制、十进制转换及应用汇编语言是一种底层的编程语言,它可以直接操作计算机硬件,具有高效性和灵活性。
在计算机系统中,二进制和十进制是两种常见的数值表示方式。
本文将介绍如何使用汇编语言实现32位二进制和十进制之间的转换,并讨论其在实际应用中的作用。
首先,我们需要了解32位二进制和十进制的表示方法。
32位二进制是由32个二进制位组成的数值,每个位上可以是0或1,可以表示的数值范围是0到2的32次方减1。
而十进制是由0到9这10个数字组成的数值,每个数字的权值是10的某次方,例如123表示1*10^2+2*10^1+3*10^0=123。
在汇编语言中,我们可以使用位运算符和乘除法运算符来进行二进制和十进制的转换。
下面是一个将32位二进制转换为十进制的简单例子:```assemblymov eax, 10101010101010101010101010101010b ; 将二进制数赋值给eax寄存器mov ebx, 0 ; 初始化十进制数为0mov ecx, 1 ; 初始化权值为1loop:shr eax, 1 ; 右移一位,相当于除以2jnc skip ; 如果最低位是0,跳过加法add ebx, ecx ; 加上当前权值skip:add ecx, ecx ; 权值乘以2 cmp ecx, 100000000h ; 判断是否超出32位jnc done ; 如果超出32位,跳出循环jmp loop ; 继续循环done:; 十进制数已经存储在ebx寄存器中```以上代码使用了循环和条件判断语句,每次将二进制数右移一位,判断最低位是否为1,如果是则加上当前权值,否则跳过加法。
最后判断权值是否超出32位,如果是,则跳出循环,十进制数已经存储在ebx寄存器中。
除了将二进制转换为十进制,我们还可以将十进制转换为二进制。
下面是一个将十进制转换为32位二进制的简单例子:```assemblymov eax, 123 ; 将十进制数赋值给eax寄存器mov ebx, 0 ; 初始化二进制数为0mov ecx, 1 ; 初始化权值为1loop:cmp ecx, 100000000h ; 判断是否超出32位jnc done ; 如果超出32位,跳出循环cmp eax, ecx ; 判断是否小于当前权值jb skip ; 如果小于,跳过or ebx, ecx ; 将当前权值设置为1sub eax, ecx ; 减去当前权值skip:add ecx, ecx ; 权值乘以2 jmp loop ; 继续循环done:; 二进制数已经存储在ebx寄存器中```以上代码使用了循环和条件判断语句,每次将当前权值与十进制数进行比较,如果小于当前权值,则跳过,否则将当前权值设置为1,并从十进制数中减去当前权值。
用OD和CE,总不断找汇编资料,解读指令,实在是累。
总算找到篇比较完整的资料,与大家分享。
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器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),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
assume cs:code,ds:datadata segmentNA dw 0F321H,09AFCHNB dw 08818H,0301DH;-------第一个字是等待相乘的数的高16位,第二个是低十六位T1 dw 0,0,0T2 dw 0,0,0;-------32位数乘以16位数不可能大于48位,所以分配3个字R dw 0,0,0,0;-------32位数乘以32位数不可能大于64位,所以为结果分配4个字data endscode segmentstart:mov ax,datamov ds,ax;-------初始化段寄存器Step1:mov ax,NA+2mov bx,NB+2mul bxmov T1+4,axmov cx,dx;-------Number A的低16位乘以Number B 的低十六位,结果存入T1+4 ;进位存入CXmov ax,NAmov bx,NB+2mul bxmov T1+2,axadd T1+2,cxadc T1,dx;-------Number A的高16位乘以Number B 的低十六位,结果存入T1+4 ;结果存入T1+2,将T1+2与上一次相乘的进位相加存入T1+2;将第二次相乘的进位带符号相加入T1(前一位的相加可能产生进位) Step2:mov ax,NA+2mov bx,NBmul bxmov T2+4,axmov cx,dx;-------同理mov ax,NAmov bx,NBmul bxmov T2+2,axadd T2+2,cxadc T2,dx;-------同理SUM:mov ax,T1+4mov R+6,axmov ax,T2+4add T1+2,axmov ax,T1+2mov R+4,axmov ax,T2+2adc T1,axmov ax,T1mov R+2,axmov ax,T2adc R,ax;-------错位相加mov ax,4C00Hint 21Hcode endsend start原理图:NA NA+2×NB NB+2——————————————————T1 T1+2 T1+4+T2 T2+2 T2+4——————————————————R R+2 R+4 R+6编写一个程序,从键盘上连续输入多个字符,遇到“$”时终止,然后以与输入相反的顺序将该字符串以大写的形式在屏幕上显示出来要求:用“先进后出”的设计思路,使用堆栈技术,结合DOS的中断调用,实现输入字符串的倒序显示CODE SEGMENT ;作业ASSUME CS:CODE,ds:codeorg 100hSTART:push cspop dscldlea dx,msgmov ah,9int 21h ;提示xor cx,cxt0:mov ah,1int 21h ;接收数据cmp al,'$' ;'$'结束程序jz showcmp al,'a'jb y1cmp al,'z'ja y1sub al,20h ;小写转大写y1:inc cxpush axjmp t0jcxz quitshow:mov al,0dhinc cxpush axmov al,0ahinc cxpush ax ;字符串倒序输出mov cx,cxnext:pop dxmov ah,2int 21hloop nextquit:mov ah,1int 21h ;等待MOV AX,4C00HINT 21Hmsg db 09,'Input a string...',0dh,0ah,'$'CODE ENDSEND START。
intel32位汇编语言程序设计Intel 32位汇编语言程序设计一、概述Intel 32位汇编语言是一种低级语言,用于编写计算机程序。
它是针对Intel x86系列处理器的指令集架构而设计的。
本文将介绍Intel 32位汇编语言程序设计的基本概念、语法和应用。
二、语言特点1. 低级语言:汇编语言是一种低级语言,直接操作计算机硬件。
相比高级语言,它更接近机器语言,能够更精确地控制计算机的执行。
2. 面向硬件:汇编语言直接操作寄存器、内存和指令,能够充分发挥计算机硬件的性能,对于性能要求较高的应用场景有着独特的优势。
3. 强大的控制能力:汇编语言允许程序员直接控制程序的执行流程,包括条件跳转、循环和子程序调用等。
三、语法结构1. 指令:汇编语言的基本单位是指令,每条指令都对应着一条机器指令。
指令由操作码和操作数组成,用于执行特定的操作。
2. 寄存器:寄存器是汇编语言中的重要概念,用于存储数据和执行运算。
x86架构提供了多个通用寄存器,如EAX、EBX等,以及一些特殊用途的寄存器,如ESP、EIP等。
3. 内存:汇编语言通过内存来读写数据。
内存地址可以使用直接地址、间接寻址、寄存器间接寻址等方式进行访问。
4. 标志位:标志位用于记录程序执行过程中的状态信息,如进位标志、零标志等。
程序可以根据标志位的值来进行条件跳转或判断。
四、程序设计1. 输入和输出:汇编语言程序可以通过中断或者直接操作设备端口来进行输入和输出操作。
例如,可以通过INT 21H中断来进行字符输入输出,或者通过IN和OUT指令直接操作设备端口。
2. 控制结构:汇编语言提供了条件跳转和循环等控制结构,用于实现程序的逻辑控制。
通过比较指令和条件跳转指令,可以实现条件判断和分支执行。
通过循环指令,可以实现重复执行某段代码的功能。
3. 子程序调用:汇编语言支持子程序调用,可以将一段逻辑进行封装,实现代码的复用。
通过CALL和RET指令,可以实现子程序的调用和返回。
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位汇编语言的入门知识,包括寄存器、指令、堆栈和函数调用等内容。