摘要: 在理解这4个操作符之前,应该先理解STACK的概念。 之前讲到2个内存交换数据可以通过数据寄存器 或 XCHG操作符来实现,这次我们用PUSH和POP来实现下吧;test_10INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.dataval1 DWORD 10hval2 DWORD 20h.codemain PRO... 阅读全文
posted @ 2011-11-06 15:50 锅子 阅读(644) 评论(0) 推荐(0) 编辑
摘要: 之前的 程序都是顺序执行,现在我们看看,如果做到循环,循环需要一个计数器来记录次数,ECX就是这个功能。LOOP用来跳转到 标号,当ECX=0时,循环结束;test_09INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.dataarrayA WORD 10h,20h,30h,40h.codemain PROC mov edi ,OFFSET arrayA mov ecx,LENGTHOF arrayA mov eax,0 @@: add eax,[edi] add edi,TYPE arrayA loop... 阅读全文
posted @ 2011-11-06 13:11 锅子 阅读(436) 评论(0) 推荐(0) 编辑
摘要: 数据类型,我们大概已经了解了几种,现在看看如何实现 自定义的类型;test_08INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIBMYWORD TYPEDEF PTR WORD.dataarrayA MYWORD 10h,20h,30hptr1 MYWORD arrayA.codemain PROC mov esi ... 阅读全文
posted @ 2011-11-06 11:51 锅子 阅读(284) 评论(0) 推荐(0) 编辑
摘要: LBAEL是一个别名,但是不需要分配存储空间,如果你熟悉过其他高级语言,理解声明和定义,别名就是起到了声明的作用,但是没有分配空间!;test_07INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.dataval_lb1 LABEL WORDval1 DWORD 12345678hval_lb2 LABEL DWORDval2 WORD 5432hval3 WORD 9876h.codemain PROC mov ax,val_lb1 mov ebx,val_lb2 call DumpRegs ... 阅读全文
posted @ 2011-11-05 20:55 锅子 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 我们来看下 3个长度的操作符。 TYPE 返回的是相应数据类型的长度 LENGTHOF 计算数组的数目 SIZEOF 返回的是总的内存空间,可以按TYPE*LENGTHOF 计算。;test_06INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.dataval1 WORD 5 DUP(3 DUP(?),0,0,0),0,0.codemain PROC mov eax,type val1 mov ebx,lengthof val1 mov ecx,sizeof val1 call DumpRegs exitma. 阅读全文
posted @ 2011-11-05 20:40 锅子 阅读(622) 评论(0) 推荐(0) 编辑
摘要: PTR 是一个很常用的操作符,是用来强制操作数的的大小的。;test_05INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.dataarrayA BYTE 78h,56h,34h,12h.codemain PROC mov al,BYTE PTR arrayA mov ax,WORD PTR arrayA mov ax,WORD PTR arrayA+2 mov eax,DWORD PTR arrayA call DumpRegs exitmain endpEND main大家观察下 寄存器ea... 阅读全文
posted @ 2011-11-05 16:27 锅子 阅读(328) 评论(0) 推荐(0) 编辑
摘要: OFFSET 操作符返回的是 数据标号的偏移地址,看代码;test_03INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.datab_val BYTE ?w_val WORD ?d_val1 DWORD ?d_val2 DWORD ? .codemain PROC mov eax,offset b_val m... 阅读全文
posted @ 2011-11-05 15:07 锅子 阅读(514) 评论(0) 推荐(0) 编辑
摘要: 其实前面我们见识过了 add,就是数学中加法,减法 就是sub inc 和 dec 这是一对,inc 是递增+1,dec是递减-1。 neg 就是取反,简单的说 数值前面 + 变- ,或者- 变 +。 加减运算 会影响 一些相关的EFLAGS ,具体参考上一帖子。 看代码;test_02INCLUDE irvine32.incINCLUDELIB Irvine32.libINCLUDELIB KERNEL32.LIB.dataval1 dWORD 100h.codemain PROC mov eax,val1 ;100h传递到寄存器eax inc eax ;eax+1h dec eax ... 阅读全文
posted @ 2011-11-05 09:31 锅子 阅读(621) 评论(0) 推荐(0) 编辑
摘要: 先看图 园子里找的图,再附上理论,具体操作等以后慢慢讲。 标志寄存器用来保存在一条指令执行完成后,CPU所处状态的信息及运算结果的特征。 16位标志寄存器 FLAGS 32位标志寄存器 EFLAGS SF:若运算结果为负(即结果的最高位为1,因为机器内的数据都是以补码形式表示)则SF=1,否则SF=0 ZF:若运算结果为0,则ZF=1,否则ZF=0 OF:当将操作数作为有符号数看时,用该标志位判断运算结果是否溢出 加法:若同符号数相加,而结果符号与之相反,则OF=1.否则OF=0 减法:被减数与减数异号,而结果的符号与减数相同则OF=1,否则OF=0 (比如5-(-3)的话,结果不应该... 阅读全文
posted @ 2011-11-04 16:22 锅子 阅读(582) 评论(0) 推荐(0) 编辑
摘要: MOV 大家在前面都见识过了。。其实用高级语言来说就是 = 的意思,赋值,不是==哦。 MOV指令是最基本的操作寄存器方式,主要注意4点。 1.目的和源,尺寸必须一致 mov eax,ax mov ax,ah mov al,eax 这些都是错误的!尺寸一致,指的是位数,即,大家都是32位,那就OK。 2.目的和源,不能都是内存操作数, 如果真想来回捣鼓 2个 内存数,那就用数据寄存器做中转站吧。 记得初学编程的时候,喜欢用temp 做临时变量,然后替换2变量,把temp 用数据寄存器就OK了。 3.CS,EIP,IP,不能直接用MOV操作,具体如何改变他们的值,以后再说。 4.立即数不... 阅读全文
posted @ 2011-11-04 15:49 锅子 阅读(696) 评论(0) 推荐(0) 编辑