11 2023 档案
摘要:计算局部变量的地址 .386 .model flat,stdcall option casemap:none .stack 4096 Include Irvine32.inc includelib Irvine32.lib ExitProcess PROTO,dwExitCode:DWORD .da
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .stack 4096 include windows.inc ExitProcess PROTO,dwExitCode:DWORD STUDENT struct ;自定义数据结构 name DWORD ? I
阅读全文
摘要:1.全局标号和局部标号 当在程序中使用一条跳转指令的时候,可以用标号来表示跳转的目的地,编译器在编译的时候会把它替换成地址,标号既可以定义在目的指令同一行的头部,也可以在目的指令前行单独用一行定义,标号定义的格式是:标号名:目的指令 ;方法1 或 标号名::目的指令 ; 方法2 常用的方法是使用方法
阅读全文
摘要:.386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD .data lptext BYTE "消息",0 lpcapti
阅读全文
摘要:32位模式下整数乘法可以实现32、16或8位的操作,64位下还可以使用64位操作数。 MUL执行无符号乘法,IMUL执行有符号乘法 MUL:无符号数乘法 32 位模式下,MUL(无符号数乘法)指令有三种类型: 执行 8 位操作数与 AL 寄存器的乘法;执行 16 位操作数与 AX 寄存器的乘法;执行
阅读全文
摘要:Win32API是用堆栈来传递参数的, 调用者把参数一个个压入堆栈, DLL中的函数程序再从堆栈中取出参数处理, 并在返回之前将堆栈中已经无用的参数丢弃。 Win32API调用中要把参数放入堆栈,顺序是最后一个参数最先进栈 invoke语句 invoke伪指令,它的格式是: 注意, invoke并不
阅读全文
摘要:下面是包含全部段的源程序结构: 堆栈段 由于Win 32汇编不必考虑堆栈, 系统会为程序分配一个向下扩展的、足够大的段作为堆栈段, 所以.stack段定义常常被忽略 在程序中不必定义堆栈段,系统会自动分配堆栈空间。惟一值得一提的是,堆栈段的内存属性是可读写并且是可执行的,这样靠动态修改代码的反跟踪模
阅读全文
摘要:Irvine32库 VS2019添加Irvine32链接库 Irvine32库下载: 链接:https://pan.baidu.com/s/1WSPnB2iFSLf3CcAPebVdKA 提取码:6666 Irvine32 链接库提供了很多简单的输入输岀接口,因此有必要添加Irvine32链接库,方
阅读全文
摘要:PUSHAD指令按照EAX、ECX、EDX、EBX、ESP(执行PUSHAD之前的值) 、EBP、ESI及EDI的顺序, 将所有32位通用寄存器压入堆栈。 POPAD指令按照相反的顺序将同样的寄存器弹出堆栈
阅读全文
摘要:PUSHA指令按顺序(A X、CX、DX、BX、SP、BP、SI 及DI) 将16位通用寄存器压入堆栈。 POPA指令按照相反的顺序将同样的寄存器弹出堆栈。
阅读全文
摘要:32位汇编 执行动作分为两步: 第一步:改变栈地址 如果操作数是16位, 则ESP减2; 如果操作数是32位, 则ESP减4 esp=esp-2或esp=esp-4 第二步:写入数据 PUSH指令有3种格式: 实例:把字符串顺序倒转 .386 .model flat,stdcall .stack 4
阅读全文
摘要:JMP指令无条件跳转到目的地址, 该地址用代码标号来标识, 并被汇编器转换为偏移量。语法如下所示:
阅读全文
摘要:LABEL伪指令可以插入一个标号, 并定义它的大小属性, 但不为这个标号分配存储空间。 LABEL可以使用所有的标准大小属性, 如BYTE、WORD、DWORD、QWORD或T BYTE。 LABEL通常的用法是, 为在数据段中定义的下一个变量提供另一个名称和大小属性 .386 .model fla
阅读全文
摘要:SIZEOF操作符的返回值等于LENGTHOF与TYPE的返回值的乘积 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data intArray WORD 32 DUP(0) .code main P
阅读全文
摘要:LENGTH OF操作符计算数组中元素的个数 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .data byte1 BYTE 10,20,30 arrayl WORD 30 DUP(?) ,0,0 ar
阅读全文
摘要:TYPE操作符返回变量的单个元素的大小, 以字节为单位计算。例如,TYPE对字节操作得1,对字操作得2,对双字操作得4,对四字操作得8。 .386 .model flat,stdcall option casemap:none .data var1 BYTE ? var2 WORD ? var3 D
阅读全文
摘要:指明内存数据的大小 PTR操作符可以覆盖一个已经被声明过的操作数的大小。只有在试图用不同于汇编器认定的大小属性来访问操作数时,这个操作符才是必需的。例如, 假设想要将一个双字变量my Double的低16位传送给A X。由于操作数大小不匹配,汇编器不允许这种传送: .386 .model flat,
阅读全文
摘要:ALIGN伪指令将一个变量对齐到字节边界、字边界、双字边界或段落边界。语法如下: ALIGN bound bound可取值1、2、4、8或16。 当取值为1时, 下一个变量对齐于1字节边界(默认情况)。 当取值为2时,下一个变量对齐于偶数地址。 当取值为4时,下一个变量地址为4的倍数。 当取值为16
阅读全文
摘要:OFFSET操作符返回数据标号的偏移量。这个偏移量表示的是按字节计算该数据标号距离数据段起始地址的距离。 .386 .model flat,stdcall option casemap:none .data bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWO
阅读全文
摘要:CF进位标志位 一般情况下, 在进行无符号整数运算的时候, 它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 有进位或者借位时CF=1,并且debug显示为CY; 否则CF=0,debug显示为NC 提示:INC和DEC指令不影响进位标志。在非零操作数上应用NEG指令总是会将进位标
阅读全文
摘要:neg指令详细解释规则:1. neg reg (对寄存器操作)2. neg mem(对内存操作)作用:将目的操作数的所以数据位取反加1影响的标志:进位标志(CF),零标志(ZF),符合标志(SF),溢出标志(OF),辅助进位标志(AF),奇偶标志(PF) 当操作数为0时,置CF位为0当操作数不为0时
阅读全文
摘要:不带借位的减法指令 SUB指令从目的操作数中减去源操作数。指令的语法为:SUB dest, source .386 .model flat,stdcall option casemap:none .data var1 DWORD 30000h var2 DWORD 10000h ExitProces
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .data var1 DWORD 10000h var2 DWORD 20000h ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov eax,var1
阅读全文
摘要:INC(递增) 和DEC(递减) 指令分别表示将寄存器或内存操作数加1和减1。 语法如下:INC reg/mem DEC reg/mem 溢出标志、符号标志、零标志、辅助进位标志,以及奇偶标志会根据目的操作数的值而发生变化。INC和DEC指令不影响进位标志 .386 .model flat,stdc
阅读全文
摘要:XCHG(交换数据) 指令交换两个操作数的内容。 该指令有三种形式:XCHG reg, reg XCHG reg, mem XCHG mem, reg 不接受立即操作数 .386 .model flat,stdcall option casemap:none .data var1 word 2 Ex
阅读全文
摘要:LAHF LAHF(将状态标志装入到AH) 指令将EFLAGS寄存器的低字节复制到AH。被复制的标志有:符号标志、零标志、辅助进位标志、奇偶标志及进位标志。 .386 .model flat,stdcall option casemap:none .data saveflags BYTE ? Exi
阅读全文
摘要:32位mov MOV指令将数据从源操作数复制到目的操作数。 在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数: MOV destination, source 其中,目的操作数的内容会改变,而源操作数不会改变 在几乎所有的汇编语言指令中,左边的操作数是目的操作数,而右边的操作数是源
阅读全文
摘要:如果需要执行超过32位整数的算术运算,就可以使用64位寄存器和变量 ExitProcess PROTO ;函数的声明不需要参数 .data sum QWORD 0 .code main PROC mov rax, 5 ;rax是64位寄存器 add rax, 6 mov sum, rax mov e
阅读全文
摘要:.386 .model flat,stdcall option casemap:none .data continueMsg TEXTEQU <"Do you wish to continue (Y/N)?"> ;分配的是文本 Prompt1 BYTE continueMsg ;变量prompt1使
阅读全文
摘要:计算数组或字符串占用的字节数 声明数组大小更好的方法是,让汇编器来计算这个值。$操作符(当前位置计数器)返回当前程序语句的偏移量。在下例中, 从当前位置计数器($) 中减去list的偏移量, 就得到 .386 .model flat,stdcall option casemap:none .data
阅读全文
摘要:符号$被称为当前位置计数器 .data selfPtr DWORD $ ;声明了一个变量selfPtr,并将其初始化为该变量的偏移量
阅读全文
摘要:REAL4定义4字节单精度浮点变量, REAL8定义8字节双精度数值, 而REAL10定义10字节扩展精度数值。 DB伪指令也可以定义有符号或无符号的8位变量: val1 DB 255 ;无符号字节 val2 DB -128 ;有符号字节
阅读全文
摘要:1.调试运行 如图: 1.EFL就是标志寄存器 2.右击窗口 选中标志,则窗口将显示各个标志值 标志值从左到右依次为:OV(溢出标志)、UP(方向标志)、EI(中断标志)、PL(符号标志)、ZR(零标志)、AC(辅助进位标志)、PE(奇偶标志)及CY(进位标志)。 寄存器窗口的一个重要特点是, 在单
阅读全文
摘要:.386 ;.386伪指令,它表示这是一个32位程序,能访问32位的寄存器和地址 .model flat,stdcall ;.model伪指令必须出现在.stack、.code和.data伪指令之前。 option casemap:none ;上面三条具体看:https://blog.csdn.ne
阅读全文
摘要:32位汇编 看:https://www.cnblogs.com/liming19680104/p/17744270.html 其中的 方法五--VS2019纯汇编 64位汇编 1.用VS2019创建空项目 2.生成依赖项 3.添加asm文件 4.重要:把目标平台改为x64 5.添加代码和设置断点 E
阅读全文
摘要:INVOKE ExitProcess,0 参数:退出代码
阅读全文
摘要:标识符(identifier) 是由程序员选择的名称, 它用于标识变量、常量、过程或代码标号。 标识符的形成有以下规则: ●可以包含1至247个字符。●不区分大小写。●第一个字符必须为字母(A…Z,a…z)、下划线(_)、@、?或$。其后的字符也可以是数字。●标识符不能与汇编器保留字相同。
阅读全文
摘要:进制标识 26 十进制 26d 十进制 11010011b ;二进制 42q 八进制 42o 八进制 1Ah ;十六进制 0A3h ;十六进制 以字母开头的十六进制常量必须加个前置0,以免汇编器将其解释为标识符。前面那列数中的十六进制值A3h就属于这种情况,必须写成0A3h
阅读全文
摘要:在64位模式下,虽然处理器目前只支持48位的地址,但在理论上,地址可大到64位。 从寄存器来看,与32位处理器最主要的区别如下: ●16个64位通用寄存器(在32位模式下只有8个通用寄存器) ●8个80位浮点寄存器●1个64位状态标志寄存器, 称为R FLAGS(只使用了低32位) ●1个64位指令
阅读全文
摘要:Intel64架构引入了一个新的模式, 称为IA-32e。从技术上看, 这个模式包含两个子模式:兼容模式(compatibility mode) 和64位模式(64-bit mode) 。不过将它们称为模式而不是子模式更方便些,因此,以后称其为模式。兼容模式当运行在兼容模式(也称为32位模式)下时,
阅读全文