win32汇编
p0inter
生而自由,爱而无畏,保持热爱奔赴山海
展开
-
汇编shr命令
左移命令比如:mov eax,10shr eax,0x2上面的命令是将eax的值左移两位,怎么左移呢?首先将eax的值转为二进制10------》1010,然后左移两位变成10,所以执行为shr命令,eax的值为十进制的2原创 2020-06-07 22:19:26 · 4324 阅读 · 1 评论 -
JBE、JNBE、JA、JL指令详解(从原理上)
JBE当执行到JBE命令时,如果此时的CF标志位或者ZF标志位为1,跳转,其他不跳转相当于小于等于命令cmp eax,ecxjbe 0040100c执行到cmp命令时,如果此时的eac小于等于ecx,jbe都会跳转到0040100c因为小于的时候,CF=1,等于的时候,ZF=1JNBE(JA)JNBE和JA用法相同,只是写法不同,当执行到JA(JNBE)时,如果CF=0且ZF=0...原创 2020-04-16 21:49:18 · 28773 阅读 · 1 评论 -
JO、JNO、JB、JNB命令详解(从原理上)
JO当执行到jo命令时,如果ZF标志位为1,则跳转,反之不跳转add eax,ecxjo 00401000c此时eax=7fff ffff ,ecx=0000 0001,执行完add命令,OF=1,原因是eax存储的最大值是7fffffff,再加1,会溢出,当执行jo时跳转JNO当执行到jno命令时,如果ZF标志位为0,则跳转,反之不跳转,与JO相反JB当执行到JB命令时,如果C...原创 2020-04-16 21:20:24 · 12797 阅读 · 1 评论 -
JS、JNS、JP(JPE)、JNP(JPO)指令详解、从原理上解释
JS格式:js 地址当执行到JS指令时,如果标志位SF=1,则跳转到指定的地址,如果SF=0,不跳转比如:cmp eax,ecxjs 0040100c此时eax=0,ecx=1,执行完cmp命令,符号标志位SF=1,执行到JS时,跳转到0040100c处执行JNS格式:jns 地址当执行到JNS指令时,如果标志位SF=0,则跳转到指定的地址,如果SF=1,不跳转...原创 2020-04-15 23:45:05 · 18732 阅读 · 0 评论 -
汇编test指令
功能:将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位,并不改变操作数1和操作数2的值test 操作数1,操作数2我们经常用test来判断一个值是否为0,用法:test 操作数1,操作数1比如我们来判断eax现在的值是否为0:test eax,eax然后根据标志位来进行操作...原创 2020-04-14 21:01:03 · 10746 阅读 · 0 评论 -
XADD和NEG命令
XADD交换相加指令,先交换然后相加比如说:xadd eax,ecx/*相当于: 先执行: xchg eax,ecx 然后执行: add eax,ecx*/此时eax=2,ecx=3,执行完:eax=5,ecx=2neg取负数指令比如执行:neg eax此时eax=0000 0002(十进制为2),执行完...原创 2020-04-13 21:38:37 · 1993 阅读 · 0 评论 -
imul和idiv指令
imul有符号乘法指令,分单操作数,双操作数和但操作数单操作数:此形式与mul指令使用完全相同,操作数乘以al、ax、或eax寄存器中的值,乘积分别存储到ax、dx:ax或edx:eax中执行指令:imul cl此时eax=FFFFFFFA(-6),ecx=0000 0002,结果:双操作数:第一个操作数乘以第二个操作数。第一个操作数是通用寄存器,第二个操作数可以是立即数、通...原创 2020-04-13 21:22:48 · 3859 阅读 · 0 评论 -
mul和div指令(8位,16位,32位)
MUL无符号乘法指令,默认操作数与eax相乘(这里只说32位,其他与下面的div类似)格式:mul 操作数 //操作数只有一个操作数与eax相乘,结果共有16位(这里的16位是16进制数),高8位放在edx中,低8位放在eax中执行命令下面的命令,此时,ecx为00000005,eax为ffff fff9ffff fff9的无符号十进制是4294967289,ecx无符号十进制...原创 2020-04-13 20:52:36 · 5602 阅读 · 1 评论 -
ADC和SBB命令
ADC带进位加法指令用法:adc 操作数1,操作数2相当于:操作数1+操作数2+进位标志CF->操作数1现在的eax是0,C=1,用adc指令直接会是0x6SBB带进位减法指令用法:sbb 操作数1,操作数2相当于:操作数1-操作数2-进位标志CF->操作数1执行完eax的值为:...原创 2020-04-11 18:29:33 · 1887 阅读 · 0 评论 -
LEA与XCHG
LEA格式:LEA 通用寄存器 内存地址功能:取地址命令将内存地址赋值给寄存器lea eax,dword ptr ds:[ecx+0x16]dword 双字 就是四个字节ptr pointer缩写 即指针ds 数据段版寄存器[]里的数据是一个地址值,这个地址指向一个双字型数据将dword ptr ds:[ecx+0x16]的地址赋值给eax,我们...原创 2020-04-11 18:08:23 · 324 阅读 · 0 评论 -
MOVSX和MOVZX
MOVSX先符号扩展,再传送格式:MOVSX 操作数A ,操作数B //操作数B的空间小于A比如说我们使用命令:movsx eax,bxbx是16位,eax是32位,传值过程:先用bx的符号位把eax高16填满,bx传值到eax的低16位我们观察EAX的值,和EBX的值,bx现在是A123,符号位是1(用计算器将其转为二进制,最高位就是符号位)执行movsx eax,...原创 2020-04-10 23:28:53 · 3273 阅读 · 2 评论 -
PUSHAD和POPAD,以及PUSHA和POPA
PUSHADPUSHAD也叫保护现场,就是把我们的寄存器压入栈中pushad是把eax,ecx,edx,ebx,esp、ebp,esi,edi依次压入栈中,ESP会减少32,相当于:push eaxpush ecxpush edxpush ebxpush esppush ebppush esipush edi就是我们在OD的寄存器窗口,看到的寄存器顺序,按照由上往下的顺序,...原创 2020-04-10 22:55:09 · 3889 阅读 · 0 评论 -
标志寄存器:CF、PF、AF、ZF、SF、TF、DF、OF
标志寄存器:C、P、A、Z、S、T、D、O的内容只会是0或1,0表示假,1表示真O:溢出标志一个寄存器如果存放的值超过所能表示的范围,就称为溢出,O溢出时被置为1,否则,O的值被清为0。比如说EAX存放的最大值是11111111…(32个)转成16进制是7FFFFFFF,如果再加一就会溢出,我们用OD,修改当前的EAX值为7FFFFFFF,在执行add eax,1就会溢出,观察O标志位。...原创 2020-04-09 21:10:23 · 12349 阅读 · 0 评论 -
常用汇编浮点操作指令
如果不知道ST(0),可以看这篇文章:FPU数据寄存器浮点数载入指令:fld src ;将浮点数src压入ST(0)fild src ;将整数src压入ST(0);f:float(浮点数)i:integer(整数) ld:load(加载)浮点数存储指令:fst dst ;去浮点数ST(0)到dst,不影响栈状态fist dst ;取整数ST(0)到dst,不影响栈状态fstp...原创 2020-02-07 15:30:00 · 2348 阅读 · 0 评论 -
FPU数据寄存器
FPU有8个独立的、可寻址的80位数据寄存器R0-R7,如下图所示,这些寄存器合称为寄存器栈。FPU 状态字中名为 TOP 的一个 3 位字段给出了当前处于栈顶的寄存器编号。例如,在下图中,TOP 等于二进制数 011,这表示现在栈顶为 R3。在编写浮点指令时,这个位置也称为 ST(0)(或简写为 ST)。最后一个寄存器为 ST(7)。入栈操作也称为加载,将 TOP 减 1,并把操作数复制到...原创 2020-02-07 15:06:31 · 1676 阅读 · 0 评论 -
call和ret(f)指令
call指令CPU执行call指令时,进行两步操作将当前的ip(eip)或者cs和ip(ecs和eip)压入栈中跳转到标号处call 标号将当前的IP压栈后,转到标号处执行指令相当于:push ipjmp near ptr 标号call far ptr 标号相当于执行:push CSpush IPjmp far ptr 标号RET指令CPU执行ret指令,相当...原创 2020-02-07 12:38:23 · 383 阅读 · 0 评论 -
cmp指令
功能:比较格式:CMP destination,sourceCMP 指令比较整数。字符代码也是整数,因此可以用 CMP 指令。如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系mov eax,10cmp eax,20;ZF=0,CF=1mov eax,10cmp...原创 2020-02-06 21:23:41 · 820 阅读 · 0 评论 -
标志寄存器EFLAGES
EFLAGES是32位,对我们比较有用的是低16位OF:溢出标志。溢出为1,否则为1DF:方向标志。串处理指令的方向IF:中断标志AF:辅助进位标志。进位时为1,否则为0ZF:零标志。运算结果为0时为1,否则为0SF:符号标志。结果为负时为1,否则为0CF:进位标志。进位为1,否则为0PF:奇偶标志。操作数中1的个数为偶数时为1,否则为0...原创 2020-02-06 20:43:05 · 485 阅读 · 0 评论 -
jmp指令
功能:无条件转移指令jmp指令要给出两种信息:转移的目标地址转移的距离(段间转移、段内短转移、段内近转移)段内短转移:jmp short 标号)assume cs:codecode segment start:mov ax,0 jmp short s add ax,1 s: inc axcode endsend start上面的程序执行后ax为1,a...原创 2020-02-06 18:57:47 · 1535 阅读 · 0 评论 -
汇编offset
功能:取标号的偏移地址assume cs:codesgcodeseg segment start:mov ax,offset start s: mov ax,offset scodeseg endsend startmov ax,offset start 相当于mov ax,0,因为start是代码段中的标号,他所标记的指令是代码中的第一条指令,偏移地址为0mov ax,of...原创 2020-02-06 17:24:27 · 6023 阅读 · 0 评论 -
dup和dd指令
dup功能:和数据定义的伪指令配合使用,用来进行数据的重复格式:数据类型 重复的次数 dup (重复的数据)db 3 dup(0)相当于db 0,0,0;定义了3个字节,他们的字节都是0db 3 dup(0,1,2)相当于 db 0,1,2,0,1,2,0,1,2dd功能:定义dword(double word)型数据,32位data segment db 1 d...原创 2020-02-06 14:09:22 · 1975 阅读 · 1 评论 -
汇编指令处理的数据长度
在8086CPU中,可以处理两种尺寸的数据,byte(8位)和word(16位),所以要在指令中说明是字操作还是字节操作通过寄存器名指明要处理数据的尺寸字操作:mov ax,1mov bx,ds:[0]inc ax字节操作:mov al,1mov al,blinc al用 X ptr指明内存单元的长度,X在汇编指令中可以为word或bytemov word ptr...原创 2020-02-06 13:15:55 · 670 阅读 · 0 评论 -
BX、DI、SI、BP总结
在8086CPU中,只有这四个寄存器可以放在[…]内来进行内存单元的寻址下面的指令是错误的mov ax ,[cx]mov ax,[ax]mov ax,[dx]在[…]中,bx和bp不能同时出现,si和di不能同时出现比如下面的指令是错误的mov ax,[bx+bp]mov ax,[si+di]在[…]中使用bp,如果没有显性给出段地址,段地址就默认在ss中比如下面...原创 2020-02-06 12:49:33 · 3102 阅读 · 0 评论 -
DI和SI
si和di是8086CPU中和bx功能相近的寄存器,di和si不能分成两个8位寄存器来使用。下面的3组指令实现了相同的功能:mov bx,0mov ax,[bx]mov si,0mov ax,[si]mov di,0mov ax,[di]我们遇到si和di时,就往bx上靠,基本上bx什么功能di和si就是什么功能[bx+si]和[bx+di]:[bx+si]和[bx+di...原创 2020-02-05 16:46:16 · 1502 阅读 · 0 评论 -
汇编[bx+idata](8086)
[bx+idata]表示一个内存单元,它的偏移地址的值就是bx+idata对于指令:mov ax,[bx+200]将偏移地址为bx+200的内存单元送到ax中,段地址存放在ds中应用:进行数组处理assume cs:code,ds:datadata segment db 'BaSiC' db 'foRKE'data endscode segment start: mov...原创 2020-02-05 15:25:50 · 464 阅读 · 0 评论 -
and和or指令
and指令:逻辑与指令,按位进行与运算mov al,01100011Band al,00111011B执行后al=00100011B,两个为1才为1,所以通过该指令可将操作数对象的相应位设为0,其他位不变or指令:逻辑或指令,按位进行或运算mov al,01100011Bor al,00111011B执行后:al=01111011B。有1为1,所以通过该指令可将操作数的相应位设...原创 2020-02-05 14:48:39 · 12462 阅读 · 0 评论 -
汇编程序中,字符数据和ASCII的对应关系
在汇编程序中,用’…'的方式指明数据是以字符的形式给出的,编译器将它们转化为对应的ASCII码。assume cs:code,ds:datadata segment db 'unIX' db 'foRK'data endscode segment start: mov al,'a' mov bl,'b' mov ax,4c00h int 21hcode end...原创 2020-02-05 14:25:51 · 1920 阅读 · 1 评论 -
将数据、代码、栈放入不同的栈(8086)
先上程序:assume cs:code,ds:data,ss:stackdata segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdata endsstack segment dw 0,0,0,0,0,0,0,0,0,0stack endscode segment start: mov ax,stack ...原创 2020-02-05 13:39:18 · 265 阅读 · 0 评论 -
loop和[bx]的联合应用
计算ffff:0-ffff:b单元中的数据的和,结果存储在dx中(8086)assume cs:codecode segment mov ax,0ffffh mov ds,ax mov bx,0 mov dx,0 mov cx,12 s: mov al,[bx] mov ah,0 add dx,ax inc bx loop s mov ax,4c00h ...原创 2020-02-04 19:36:37 · 192 阅读 · 0 评论 -
loop指令
功能:循环格式:loop 标号执行过程:cx=cx-1判断cx的值,不为0则转至标号处执行程序,如果为0则向下执行从上面的执行过程可以看出,cx存放的是循环次数举个例子:实现2的12次方assume cs:codecode segmentstart: mov ax,2 mov cx,11 s: add ax,ax loop s mov ax,4c...原创 2020-02-04 16:36:39 · 797 阅读 · 0 评论 -
对一个简单汇编程序分析
程序:assume cs:codesgcodesg segment mov ax,0123H mov bx,0456H add ax,bx add ax,ax mov ax,4c00H int 21Hcodesg endsend伪指令:伪指令是写给编译器看的,CPU不会执行,在源程序中,包括两种指令,一个是汇编指令,一个是伪指令。汇编...原创 2020-02-04 13:43:50 · 858 阅读 · 0 评论 -
将10000H-1000FH这段空间当做栈,初始状态栈是空的,设置AX=001AH,BX=001BH,利用栈,交换AX和BX的数据
程序:mov ax,1000Hmov ss,axmov sp,0010H;设置AX和BX的值mov ax,001AHmov bx,001BH;压栈push axpush bx;出栈pop axpop bx解释:在8086中,段寄存器不能直接传值,要通过一般寄存器,所以先将值传到ax中,在送入ss中push指令后,栈的情况如图:此时bx的值在上面,ax的值在...原创 2020-02-04 10:49:39 · 3707 阅读 · 3 评论 -
执行POP和PUSH指令后,SS和SP的变化
我们知道push指令是将数据送入栈中,pop指令是将数据从栈顶取出来,8086CPU的入栈和出栈操作都是以字为单位的比如说将10000H-1000FH这段内存当做栈使用CPU是通过CS、IP中存放的段地址和偏移地址来知道当前要执行的指令,通过DS和[address]来访问内存数据。在8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。并且...原创 2020-02-03 22:10:58 · 15399 阅读 · 2 评论 -
POP和PUSH指令
PUSH指令:首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。PUSH 指令有 3 种格式:PUSH reg/mem16PUSH reg/mem32PUSH inm32POP指令:首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 ...原创 2020-02-02 17:05:46 · 4794 阅读 · 0 评论 -
SUB指令
形式:SUB dest, source功能:从目的操作数中减去源操作数.datavar1 DWORD 30000hvar2 DWORD 10000h.codemov eax,var1 ;EAX = 30000hsub eax,var2 ;EAX = 20000h几种形式:sub 寄存器,数据 比如:sub ax,9 ...原创 2020-02-02 16:54:31 · 25044 阅读 · 0 评论 -
DS和[address]
8086CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时,由于内存单元是字节单元,则一个字要用两个地址连续的内存单元来存放,这个字的低位存放低地址单元中,高位字节存放高地址单元中我们将起始地址为N的字单元简称为N地址字单元cpu要读取一个内存单元时,必须先给出这个内存单元的地址,物理地址和段地址和偏移地址控制,8086中有一个DS寄存器,通常用来...原创 2020-02-02 16:35:12 · 1826 阅读 · 0 评论 -
jmp、JE、JZ、JNE、JNT指令
JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量格式:JMP destination当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。JMP 指令提供了一种简单的方法来创建循环,即跳转到循环开始时的标号:top: . . jmp top ;不断地循环JMP 是无条件...原创 2020-02-02 11:12:43 · 37474 阅读 · 0 评论 -
8086的CS段寄存器(IP)
8086共有四个段寄存器,分别为CS,DS,SS,ESCS为代码段寄存器,还有个与CS息息相关的寄存器叫IP,为指令指针寄存器。在8086PC机中,设CS中的内容为M,IP的内容为N,8086CPU将从M*16+N单元开始,读取一条指令并执行。CS存放段地址,IP存放偏移地址。在8086CPU刚开始工作时,CS和IP被设置为CS=FFFFH,IP=0000H,所以刚启动时,FFFF0H单元...原创 2020-02-02 11:06:09 · 3719 阅读 · 0 评论 -
8086CPU物理地址
8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力,但8086CPU内部是16位,表现出来的寻址能力只有64kb。8086CPU采用一种在内部用用两个16位地址合成的方法来形成一个20位的物理地址。CPU中的相关部件提供两个16位地址,一个为段地址,另一个为偏移地址,地址加法器让两个16位地址合成一个20位的物理地址。物理地址=段地址16+偏移地址段地址16+偏移地址...原创 2020-02-02 10:16:18 · 3691 阅读 · 0 评论 -
汇编add和mov指令
汇编指令add:格式:add 参数1, 参数2功能:参数1和参数2相加,将结果赋值给参数1,即 :参数1=参数1+参数2汇编指令 mov:格式:MOV destination,source功能:将源操作数复制到目的操作数,将source复制到destination...原创 2020-02-01 22:16:35 · 5436 阅读 · 2 评论