自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

原创 ESP定律

当程序载入OD之后 004AC460 > $  60            pushad;程序停在这里 F8 指向pushad指令pushad是把寄存器中数据入栈 栈中数据如下:0012FFA4   7C930208   |EDI  指向栈顶0012FFA8   FFFFFFFF |ESI0012FFAC   0012FFF0 |EBP0012FFB0 

2013-07-21 19:03:00 832

原创 删除OD调试记录

删除UDD目录下文件即可

2013-07-10 18:46:31 1308

原创 PE 头文件 IMAGE_NT_HEADER

PE Header是PE相关结构NT映像头IMAGE_NT_HEADER的简称 PE头文件开始是一个字符串PE00(50 45 00 00) 由MS_DOS头部的e_1fanew字段指向 IMAGE_NT_HEADERS STRUCT{  +00H DWORD Signature  +04H IMAGE_FILE_HEADER FileHeader  +18H IMAG

2013-07-03 18:38:27 1248

原创 MS_DOS头部 IMAGE_DOS_HEADER

MS_DOS头部IMAGE_DOS_HEADER STRUCT{  +00H WORD e_magic ;DOS可执行文件标记字符串MZ(4D 5A)  +3CH DWORD e_1fanew ;指向PE文件头  } IMAGE_DOS_HEADER ENDS用十六进制编辑器打开一个EXE文件 如QQ.EXEe_magic=5A 4De_1fanew=000001

2013-07-03 18:31:41 869

原创 PE文件

PE是一种可执行文件格式基地址:当PE文件被Windows装载器装入内存后内存中的版本被称为 模块。映射文件的起始地址被称为模块句柄也成为基地址相对虚拟地址:相对于PE文件装入地址的偏移虚拟地址:实际的内存地址文件偏移地址:数据在磁盘上的地址也称物理地址参考《加密与解密》,还有fishc.com 小甲鱼的视频不错

2013-07-03 18:17:29 541

原创 用 W32DASM看IF高级语法

W32DASM一个静态调试工具代码段: .codestart: invoke MessageBox,NULL,offset messageS,offset titleS,MB_YESNO .if eax == 6 invoke MessageBox,NULL,offset msgOk,offset tipS,MB_OK .else i

2013-06-21 14:38:40 771 1

原创 Win32高级语法 条件测试语句与分支语句

.if 表达式1.elseif 表达式2.else 所以表达式为否.endf ;if语句结束下面两段程序分别使用汇编语法与高级语法对程序进行条件测试和分支,弹出对话框当点击"是"弹出对话框提示"click YES",点击"否"弹出对话框提示"click No"程序的数据段 .datatitleS db 'helloworld',0messageS db '

2013-06-21 13:40:38 577

原创 API函数MessageBox的参数与返回值

Win32汇编函数的参数,参数类型,返回值都是一个dword类型(4字节)返回值永远放在EAX中,如超过4个字节则返回一个数据的指针(指向返回值存放的缓冲区地址) .datatitleS db 'helloworld',0messageS db 'hello,welcome to win32',0 .codestart: invoke MessageBox,NULL,o

2013-06-21 13:09:33 2411

原创 继续说invoke伪指令

.data ;数据段titleS db 'helloworld',0messageS db 'hello,welcome to win32',0 .code ;代码段start:invoke MessageBox,NULL,offset messageS,offset titleS,MB_OKinvoke ExitProcess,NULLend startMASM编译下边

2013-06-21 12:35:08 1297

原创 条件转移指令和无条件转移指令练习

无条件转移指令JMP条件转移指令JEJNEJB 低于转移(小于)JNB 不低于转移(大于等于)JA 高于转移(大于)JNA不高于转移(小于等于)查找出数据中0~9的无符号数写到itable单元中0~9 大于等于0 小于等于9 用JNB和JNA最合适不过了 贴代码~assume cs:code,ds:datadata segment idata db 1,0,4

2013-06-18 13:33:34 4716

原创 8086条件转移指令JE/JZ,JNE/JNZ

JE/JZ,JNE,JNZ检测的只是ZF的值,只要ZF满足则进行转移JE的逻辑含义是相等则转移 但是JE进行操作的是ZF=1才执行所有相等则转移是通过CMP指令来配合使用体现出的CMP AX,BX ;ax-bx 结果是否为0 {true ,ZF=1} {false ,ZF=0}JE OK (ZF=1说明两数相等) (ZF=0说明两数

2013-06-18 12:05:08 16905 1

原创 8086条件转移指令JNE,JNZ

JNZ/JNE指令格式 转移条件 说明JNZ/JNE 标号 ZF=0 不等于0或不相等转移 code segmentassume cs:code mov ax,5 mov bx,2 cmp ax,bx ;两数比较 不相等则转移 jne okiout: mov ax,4c00H int 21Hok: add ax,bx jmp ioutcode e

2013-06-18 11:51:55 11005 1

原创 8086条件转移指令JE,JZ

JZ/JE指令格式 转移条件 说明JZ/JE 标号 ZF=1 等于0或相等转移code segmentassume cs:code mov ax,2 mov bx,2 cmp ax,bx je ok ;如果ax=bx 进行转移(其实是检测ZF的值进行转移操作) ;根据ZF=1 得出ax=bx ,所以才有ax=bx

2013-06-18 11:42:35 11219

原创 8086地址传送指令LEA,LDS,LES

LEA BX,[SI] ;BX<--DS:[SI]内存单元的偏移地址,与该单元中的数据无关LDS BX,[SI] ;BX<--DS:[si]内存单元中的数据的低16位,DS<--内存单元中数据的高16位LES BX,[SI] ;BX<--DS:[SI] ,ES<--DS:[SI+2]显然LDS和LES的操作数是32位的(两个字 四个字节 32位)

2013-06-17 18:25:43 8793 1

原创 8086地址传送指令LDS,LES

LDS REG,OPRE;REG是一个16位寄存器,OPRD是一个存储器操作数,为双字项,高16位送入DS,低16位送入REGLDS BX,[SI](ds:si取得存储器中32位(双字),高16位作为段值送入DS中,低十六位送入指定的BX寄存器中)data segment idata dd 12345678Hdata endscode segmentassume cs:code,

2013-06-17 17:51:52 7923

原创 8086标志操作指令

标号传送指令  LAHF 把FLAG低八位送入AH。不影响FLAG的任何位  LAHF ;把CF,PF,AF,ZF,SF送入AH的相应位即0,2,4,6,7位  `SAHF 把AH送入FLAG低八位。根据AH中的内容FLAG的低八位受到影响,高位不受影响  MOV AH,11111111B   SAHF ;(执行后CF,PF,AF,ZF,SF等于1)  `PUSHF 把FLAG

2013-06-17 14:03:43 1434

原创 8086地址传送指令LEA

LEA REG,OPRD ;操作数OPRD必须是一个存储器操作数LEA AX,IDATA ;把IDATA的偏移地址传送到AX寄存器中DATA SEGMENT IDATA DW 1,2,3,4DATA ENDSCODE SEGEMNTBEG: MOV AX,OFFSET IDATA ;AX=IDATA的偏移地址 LEA AX,IDATA ;AX=

2013-06-17 13:41:56 1101

原创 8086交换指令XCHG

XCHG OPRD1,OPRD2;实现OPRD1与OPRD2之间数据交换 ;OPRD1,OPRD2同时是字节或字操作数,MOV AX,1MOV BX,2XCHG AX,BX ;执行后AX=2,BX=1

2013-06-17 13:24:45 2429

原创 非操作指令NOT

否操作指令NOT(又称逻辑非运算) 0=1 ;非0等于1 1=0 ;非1等于0   NOT OPRD ;该指令把操作数OPRD取反然后送回OPRD   mov ah,11111111B ;FFH   not ah ;执行后AH=0H   mov ah,11110000B ;F0H not ah ;执行后AH=000011

2013-06-17 11:53:06 5976

原创 算术运算与逻辑运算

逻辑运算又称布尔运算,取值只有两个真或假,二进制数1和0在逻辑上可以代表真与假,是与否算术运算...小学就开始学的了两者的区别在与逻辑运算是按位进行的,位与位之间没有进位或借位.逻辑加法(OR)OR OPRD1,OPRD2 ;OPRD1<--OPRD1 + OPRD2 算术加法(ADD)ADD OPRD1,OPRD2 ;OPRD1逻辑乘法(AND)AND OPRD1,OPR

2013-06-17 11:47:30 2174

原创 或操作指令OR

逻辑”或”操作指令OR(逻辑加法) 0+0=0 0+1=1 1+0=1 1+1=1在给定的逻辑变量中,A或B只要有一个为1,其逻辑加的结果为1;两者都为1则逻辑加为1。 MOV AL,01100011B OR AL,10000000B ;按位根据加法表进行运算 ;结果AL= 11100011B另一种说法是用1将相应位设为1

2013-06-16 19:47:31 3867

原创 与操作指令AND

逻辑”与”操作指令AND(逻辑乘法) 0*0=0 0*1=0 1*0=0 1*1=1只当参与运算的逻辑变量都同时取值为1时,其逻辑乘积才等于1。 MOV AL,01100011B AND AL,11111110B ;按位根据乘法表计算;结果AL=01100010B另一种说法是用”0”来把相应位设置成0 MOV AL,01100011B

2013-06-16 19:35:23 1682

原创 测试指令TEST

测试指令TEST  TEST OPRD1,OPRD2 ;按位与操作,但不保存结果,仅影响标志寄存器,根据影响的标志位得到结果  该指令通常用于检测某些位是否为1,但不改变原操作值.根据ZF得知判断结果  mov al,01100011B;检测位6是否为1,如果为1那么ZF=0,如果为0那么ZF=1  TEST AL,01000000B ;AL=01000000B 第六位为1 ,运算结果中有1

2013-06-16 11:27:27 6433 1

转载 逻辑运算 或,与,非

逻辑变量之间的运算称为逻辑运算。二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量就称为逻辑变量。     计算机的逻辑运算的算术运算的主要区别是:逻辑运算是按位进行的,位与位之间不像加减运算那样有进位或借位的联系。    逻辑运算主要包括三种基本运算:逻辑加法(又称“或”运算)、逻辑乘法(又称“与”运算)和逻辑否定(又称“非”运算)。此外

2013-06-16 11:12:10 12503

原创 8086标志寄存器FLAG

8086CPU提供一个特殊的寄存器称为标志寄存器,里面包含9个标志,用来反映处理器的状态和运算结果的某些特征。FLAG是按位起作用的

2013-06-15 13:00:48 949

原创 8086变址和指针寄存器

SI和DI称为变址寄存器,在字符串操作中SI作为源指针,DI作为目的指针(ES:DI ;用作存储器指针时可用于寻址 DS:[SI],DS:[BX+DI]BP和SP称为指针寄存器,BP称为基址针,SP为堆栈指针 ;BP也可作为存储器指针DS:[bp+si],如果没有段前缀那么BP最为堆栈基址[BP]寻址的是堆栈内存IP指令指针 CS:IP指向CPU执行的指令

2013-06-15 10:47:47 2197 1

原创 8086数据寄存器

8086CPU有四个16位数据寄存器可分成8个8位寄存器AX(AH,AL)|BX(BH,BL)|CX(CH,CL)|DX(DH,DL)数据寄存器主要用来保存操作数和保存运算结果等AX 常用作累加器(accumulator)用来保存临时数据比如MOV AX,DATA将数据段地址送入AX ;MUL BL,DIV BX用来保存乘除法的结果BX 基(Base)地址寄存器,作为存

2013-06-15 10:34:38 796

原创 8086段寄存器

8086有四个段寄存器CS,DS,SS,ES任意时刻CPU执行CS:IP指向的指令,CS为代码段寄存器(IP为指令指针寄存器)任意时刻SS:SP指向栈的栈顶单元,SS为栈段寄存器我们寻找数据需要知道数据在内存的位置用DS寻址 DS为数据段寄存器ES为附加段寄存器可作为目的地址的段地址比如ES:DI

2013-06-15 09:57:26 1858

原创 8086移位指令

8086有如下3条一般移位指令SAR OPRD,M ;算术右移 对无符号数和有符号数而言右移1位相当于原数除以2SHR OPRD,M ;逻辑右移 对无符号数右移1位相当于原数除以2SHL OPRD,M/SAL OPRD,M ;逻辑/算术左移(两个助记符只有一个机器指令,进行相同的动作)左移1位相当于原数*2

2013-06-14 23:41:45 1607

原创 8086算术移位指令SAL和SAR

SAL算术左移指令同逻辑左移指令进行相同动作,机器指令一样,只是为了方便记忆而提供的两个助记符SAR算术右移指令SAR OPRD,M ;该指令使操作数右移M位,每移动1位左边的符号保持不变,移出的最低位进入CF mov al,26H ;00100110B 右移1位 = 00010011B sar al,1   ;26H/2H=13H mov ax,0F0H  mov cl,4 ;11

2013-06-14 23:22:47 10836

原创 8086逻辑移位指令SHL和SHR

SHL逻辑左移指令SHL OPRD M;把操作数OPRD左移M位,M为位移次数,为1或为CL(位移超过1次用CL表示) ;每移动一位右边用0补足一位,移出的最高位进入CF(最后移出的一位写入CF) MOV AL,00010011B ;13H  00010011B    SHL AL,1 ;把AL左移1位,移出的最高位0进入CF,右边0补足1位   0 00100110B

2013-06-14 23:13:24 8935

原创 8086除法指令DIV,IDIV

无符号除法指令DIV(DIVision) DIV OPRD  ;除数OPRD决定是8位除法还是16位除法;OPRD=8位,则被除数默认在AX中,AX除以OPRD的商保存在AL中,余数保存在AH中;OPRD=16位,则被除数默认在DX与AX中,结果的商保存在AX中,余数保存到DX中assume cs:codedata segment db 2,4data endscode segment

2013-06-14 14:33:59 7306

原创 8086乘法指令MUL,IMUL

对于加减指令来说CPU对有符号加减和无符号加减一视同仁,根据我们需要把它作为有符号的结果还是无符号的结果,但是乘除法指令区分有符号乘除和无符号乘除指令无符号数乘法指令MUL(MULtiply)MUL OPRD(OPRD可以用除立即数以外的任何寻址方式)   OPRD是八位一个乘数默认在AL中 则:AL*OPRD 结果保存在AX中   OPRD是16位一个乘数默认在AX中 则:AX*OPRD

2013-06-14 09:18:54 10429

原创 8086 INC, DEC

INC OPRD ;OPRD ;自加1指令 code segment mov ax,0 inc ax ;ax inc ax ;ax code endsDEC OPRD ;OPRD ;自减1指令 code segment mov ax,5 dec ax ;ax code ends

2013-06-14 08:58:15 2625

原创 8086减法指令SUB

减法指令SUB(SUBtraction) SUB OPRD1,OPRD2 ; OPRD1都影响FLAG标志寄存器,同样的包含两种含义(有符号减法和无符号减法)

2013-06-14 08:46:14 5359

原创 8086加法指令ADD

加法指令ADD(ADDition) ADD OPRD1,OPRD2 ;OPRD1                 ;完成OPRD1与OPRD2相加 ,结果保存在OPRD1中CODE SEGMENT MOV AX,1 MOV BX,2 ADD AX,BX ;AXCODE ENDS参与运算的操作数类型必须保持一致,同为字节或字可组合以下几种形式: ADD 寄存器,数据 ADD 寄存器,寄存器 ADD

2013-06-13 23:23:05 6222

原创 请大家编译连接并执行一下

由于是笔记,也许记得有点糟糕,也许班门弄斧没有独到见解 ,见谅见谅

2013-06-13 20:15:21 412

原创 PUSH/POP

栈操作指令PUSH 寄存器/段寄存器/内存单元POP 寄存器/段寄存器/内存单元PUSH AX1)SP=SP-2 ,SS:SP指向新的内存单元2)将AX送入SS:SP指向的内存单元POP AX1)将SS:SP指向的内存单元处的数据送入AX中2)SP=SP+2

2013-06-13 15:18:08 573

原创

栈是一种具有特殊的访问方式的存储空间,它的特殊在于后进先出SS:SP指向的存储单元为栈空间(栈的操作都为字操作)SS:SP始终指向栈顶当栈为空是SP指针指向栈顶元素为栈中最后一个字单元地址+2也可以说当栈为空时SP指向栈中最后一个存储单元的下一个单元stack segmentdw 8 dup(0);我们定义一个段使SS:SP指向这个段此时为栈段stack ends定义了16个字节的栈空间,内存单元

2013-06-13 12:10:37 618

原创 include语句

程序用到MessageBox和ExitProcess函数它们分别在user32..dll和Kernel32.dll中那么就必须在程序中使用include语句包含这两个库文件,此时程序中可以使用user32..dll和Kernel32.dll中所有的函数include相当于java中import导入包语句

2013-06-13 09:51:12 847

逻辑运算指令TEST

X86指令TEST TEST OPRD1,OPRD2 ;按位与操作,但不保存结果,仅影响标志寄存器,根据影响的标志位得到结果

2013-06-16

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除