asm:常见指令大全

2023-11-18

算数指令

INC 指令

INC的全称是Increment,表示“增加”、“递增”的意思。
INC 指令用于将操作数加 1。它对可以在寄存器或内存中的单个操作数起作用。

INC 指令的语法如下:

INC destination
目标操作数 可以是 8 位,16 位或 32 位操作数。
实例
INC EBX      ; 32 位寄存器 自增 1
INC DL       ; 8 位寄存器 自增 1
INC [count]  ; 变量 count 自增 1

DEC 指令

DEC的全称是Decrement,表示“减少”、“递减”的意思
DEC 指令用于将操作数减 1。它对可以在寄存器或内存中的单个操作数起作用。

DEC 指令的语法如下:

DEC destination
目标操作数 可以是 8 位,16 位或 32 位操作数。
实例
INC EBX      ; 32 位寄存器 自增 1
INC DL       ; 8 位寄存器 自增 1
INC [count]  ; 变量 count 自增 1

ADD 指令

用于将两个操作数相加并将结果存储到一个目标操作数中。ADD指令的语法和功能如下:

ADD destination, source

其中,destination表示目标操作数,可以是一个寄存器或内存地址;source表示源操作数,可以是一个立即数、寄存器或内存地址。ADD指令将目标操作数和源操作数相加,并将结果存储到目标操作数中。

例如,以下汇编代码使用ADD指令将寄存器AX和BX中的值相加,并将结果存储到AX寄存器中:

MOV AX, 10   ; 将立即数10存储到AX寄存器中
MOV BX, 20   ; 将立即数20存储到BX寄存器中
ADD AX, BX   ; 将AX寄存器和BX寄存器中的值相加,结果存储到AX寄存器中

注意:目标操作数和源操作数不能同时为内存地址

在执行ADD指令时,需要注意以下几点:

  1. 目标操作数和源操作数的数据类型必须相同。例如,如果目标操作数是一个字节(8位),则源操作数也必须是一个字节。
  2. 如果源操作数是一个内存地址,则需要使用方括号将其括起来。例如,ADD AX, [BX]表示将AX寄存器和BX寄存器指向的内存地址中的值相加。
  3. ADD指令可能会产生进位(carry),因此需要根据具体情况进行处理。例如,在进行无符号整数加法时,如果结果超出了目标操作数的范围,则会发生进位。

SUB指令

SUB指令用于将两个操作数相减,并将结果存储到一个目标操作数中。其余与ADD类似。

MUL指令

MUL指令是一种汇编语言中的算术指令,用于将两个操作数相乘,并将结果存储在一个目标操作数中。MUL指令的格式如下:

MUL destination

其中,destination表示目标操作数,可以是一个寄存器、立即数或内存地址。具体描述如下:

  • 如果 destination 是一个寄存器,则 MUL 指令将 AX 寄存器中的值与该寄存器中的值相乘,并将结果存储在 DX:AX 寄存器中。例如,执行 MUL BX 将计算 AX * BX,并将结果存储在 DX:AX 中。
  • 如果 destination 是一个内存地址,则需要使用方括号将其括起来。MUL 指令将 AX 寄存器中的值与该内存地址中的值相乘,并将结果存储在 DX:AX 寄存器中。例如,执行 MUL [BX] 将计算 AX * (数据段中 BX 指向的地址处的值) 并将结果存储在 DX:AX 中。
  • 如果 destination 是一个立即数,则必须是一个无符号整数,并且大小必须与 AX 寄存器的大小匹配。MUL 指令将 AX 寄存器中的值与该立即数相乘,并将结果存储在 DX:AX 寄存器中。例如,执行 MUL 5 将计算 AX * 5 并将结果存储在 DX:AX 中。

需要注意的是,在执行 MUL 指令之前,如果 DX 寄存器中有值,则需要将其清零,以避免出现错误的结果。可以使用 XOR 指令将 DX 寄存器清零,例如 XOR DX, DX

另外,由于 MUL 指令是一种无符号整数乘法指令,因此不能用于执行有符号整数乘法运算,否则会产生错误的结果。

IMUL指令

IMUL是一种汇编指令,用于执行有符号整数乘法运算。它可以将两个操作数相乘,并将结果存储在一个目标操作数中。IMUL指令的语法格式如下:

IMUL destination, source

其中,destination表示目标操作数,可以是一个寄存器、内存地址或立即数;source表示源操作数,可以是一个寄存器、内存地址或立即数。具体来说:

  • 如果 destination 是一个寄存器,则 IMUL 指令将该寄存器中的值与 source 中的值相乘,并将结果存储在 destination 中。例如,执行 IMUL BX, AX 将计算 BX = BX * AX 并将结果存储在 BX 中。
  • 如果 destination 是一个内存地址,则需要使用方括号将其括起来。IMUL 指令将该内存地址中的值与 source 中的值相乘,并将结果存储在该内存地址中。例如,执行 IMUL [BX], 5 将计算 (数据段中 BX 指向的地址处的值) * 5 并将结果存储在该地址中。
  • 如果 destination 是一个立即数,则必须是一个有符号整数,并且大小必须与 source 的大小匹配。IMUL 指令将该立即数与 source 相乘,并将结果存储在 source 中。例如,执行 IMUL AX, -5 将计算 AX = AX * (-5) 并将结果存储在 AX 中。

同MUL指令一样,在执行 IMUL 指令之前,如果 DX 寄存器中有值,则需要使用同样的方法将其清零。

另外,由于 IMUL 指令是一种有符号整数乘法指令,因此可以用于执行有符号整数乘法运算。IMUL 指令会对结果进行符号扩展,以保留正确的符号位。例如,如果执行 IMUL AX, -2,则会将 AX 寄存器中的值乘以 -2,并将结果存储在 AX 中。如果 AX 中的值为 1000(二进制表示),则结果为 1111 1111 1111 0000(二进制表示)。

在执行 IMUL 指令时,还需要注意以下几点:

  1. 目标操作数和源操作数必须是同样大小的有符号整数。
  2. 如果源操作数是一个立即数,则必须是一个有符号整数,并且大小必须与目标操作数匹配。
  3. 如果操作数是一个内存地址,则需要使用方括号将其括起来。例如,IMUL [BX], 5表示将数据段中 BX 指向的地址处的值乘以5。
  4. 在执行IMUL指令之前,必须将高位清零,否则可能会导致错误的结果。可以使用XOR指令将DX寄存器清零:XOR DX, DX

DIV指令

DIV指令是x86汇编语言中的一种算术指令,用于执行无符号整数除法操作。根据被除数和除数的数据类型不同,DIV指令有三种格式:

  1. DIV r/m8指令:将一个16位或32位的无符号整数除以一个8位的无符号整数,并返回商和余数。其语法格式如下:
DIV r/m8

其中,r/m8可以是寄存器或内存地址,指定了除数。被除数需要存储在AX(16位)或DX:AX(32位)寄存器中。

例如,下面的代码演示了使用DIV r/m8指令将16位整数bx除以8位整数al,并将商存储在ax寄存器中,余数存储在dx寄存器中:

MOV AX, BX    ; 将BX复制到AX中
MOV DX, 0     ; 初值化DX为0
MOV AL, 10    ; 将10存储到AL中
DIV AL        ; 将AX除以AL,商存储在AX中,余数存储在DX中
  1. DIV r/m16指令:将一个32位的无符号整数除以一个16位的无符号整数,并返回商和余数。其语法格式如下:
DIV r/m16

其中,r/m16可以是寄存器或内存地址,指定了除数。被除数需要存储在DX:AX寄存器中。

例如,下面的代码演示了使用DIV r/m16指令将32位整数num除以16位整数divisor,并将商存储在ax寄存器中,余数存储在dx寄存器中:

MOV EAX, num      ; 将num复制到EAX中
MOV EDX, 0        ; 初值化EDX为0
MOV BX, divisor   ; 将divisor复制到BX中
DIV BX            ; 将EAX除以BX,商存储在AX中,余数存储在DX中
  1. DIV r/m32指令:将一个64位的无符号整数除以一个32位的无符号整数,并返回商和余数。其语法格式如下:
DIV r/m32

其中,r/m32可以是寄存器或内存地址,指定了除数。被除数需要存储在EDX:EAX寄存器中。

例如,下面的代码演示了使用DIV r/m32指令将64位整数num除以32位整数divisor,并将商存储在eax寄存器中,余数存储在edx寄存器中:

MOV EAX, DWORD PTR [num + 4]   ; 将num的高32位复制到EAX中
MOV EDX, DWORD PTR [num]       ; 将num的低32位复制到EDX中
MOV EBX, divisor               ; 将divisor复制到EBX中
DIV EBX                        ; 将EDX:EAX除以EBX,商存储在EAX中,余数存储在EDX中

需要注意的是,如果除数为0,则会产生“divide by zero”异常。因此,在使用DIV指令进行除法操作时,需要确保除数是非零的。

IDIV指令

与DIV指令操作和原理一致。

逻辑指令

AND指令

AND指令是x86架构中的一种汇编指令,用于执行按位与(bitwise and)操作。其语法格式为:

AND destination, source

其中,destination和source都可以是寄存器或内存地址。执行完毕后,将destination和source进行按位与(bitwise and)操作,并将结果存储到destination中。

下面是一些AND指令的示例:

  1. 按位与两个寄存器

    MOV AX, 0FF00h     ; 将0FF00h存储到AX寄存器中
    AND AX, 0F00h      ; 将AX寄存器中的值与0F00h按位与,并将结果存储回AX寄存器中
    

    这个示例将AX寄存器中的高字节清零,只保留了低字节中的高4位。

  2. 按位与一个寄存器和一个内存地址

    MOV EBX, [ESI]     ; 将ESI地址处存储的值读取到EBX寄存器中
    AND EBX, 0FFh      ; 将EBX寄存器中的值与0FFh按位与,并将结果存储回EBX寄存器中
    

    这个示例将EBX寄存器中的值的高字节清零,只保留了低字节中的8位。

  3. 按位与两个内存地址

    MOV EDI, OFFSET array1   ; 将array1的内存地址存储到EDI寄存器中
    MOV ESI, OFFSET array2   ; 将array2的内存地址存储到ESI寄存器中
    AND DWORD PTR [EDI], DWORD PTR [ESI]  ; 将array1和array2中相同偏移量处的值按位与,并将结果存储回array1中
    

    这个示例将array1数组中相同偏移量处的值与array2数组中相同偏移量处的值进行按位与操作,并将结果存储回array1数组中相同偏移量处的位置。

OR指令

OR指令是x86架构中的一种汇编指令,用于执行按位或(bitwise or)操作。其语法格式为:

OR destination, source

其中,destination和source都可以是寄存器或内存地址。执行完毕后,将destination和source进行按位或(bitwise or)操作,并将结果存储到destination中。

下面是一些OR指令的示例:

  1. 按位或两个寄存器

    MOV AX, 0F0Fh     ; 将0F0Fh存储到AX寄存器中
    OR AX, 00FFh      ; 将AX寄存器中的值与00FFh按位或,并将结果存储回AX寄存器中
    

    这个示例将AX寄存器中的低字节设置为0xFF,而不影响高字节。

  2. 按位或一个寄存器和一个内存地址

    MOV EBX, [ESI]     ; 将ESI地址处存储的值读取到EBX寄存器中
    OR EBX, 0FFh       ; 将EBX寄存器中的值与0FFh按位或,并将结果存储回EBX寄存器中
    

    这个示例将EBX寄存器中的低字节设置为0xFF,而不影响高字节。

  3. 按位或两个内存地址

    MOV EDI, OFFSET array1   ; 将array1的内存地址存储到EDI寄存器中
    MOV ESI, OFFSET array2   ; 将array2的内存地址存储到ESI寄存器中
    OR DWORD PTR [EDI], DWORD PTR [ESI]  ; 将array1和array2中相同偏移量处的值按位或,并将结果存储回array1中
    

    这个示例将array1数组中相同偏移量处的值与array2数组中相同偏移量处的值进行按位或操作,并将结果存储回array1数组中相同偏移量处的位置。

XOR 指令

XOR指令是一种逻辑运算指令,用于对两个操作数进行异或(XOR)运算,并将结果保存到目标操作数中。在大多数计算机体系结构中,XOR指令通常被表示为“XOR”或者“^”,例如在C语言中,XOR运算可以通过“^”符号实现。

XOR运算的规则如下:

  • 如果两个操作数相等,则运算结果为0。
  • 如果两个操作数不相等,则运算结果为1。

以下是几个示例:

  • 0 ^ 0 = 0
  • 0 ^ 1 = 1
  • 1 ^ 0 = 1
  • 1 ^ 1 = 0

在汇编语言中,XOR指令通常使用以下格式表示:

XOR destination, source

其中,destination表示目标操作数,source表示源操作数。XOR指令将destinationsource进行异或运算,并将结果保存到destination中。

例如,在x86汇编语言中,可以使用以下指令将寄存器AX和另一个寄存器BX进行异或运算,并将结果保存到AX中:

XOR AX, BX

在执行这条指令后,AX中的值将等于AX ^ BX

TEST指令

TEST指令是x86架构中的一种汇编指令,用于执行按位与(bitwise and)操作,但不将结果写回到任何寄存器或内存中。其语法格式为:

TEST destination, source

其中,destination和source都可以是寄存器或内存地址。执行完毕后,将destination和source进行按位与操作,并根据结果设置标志寄存器(FLAGS寄存器)的数值。

TEST指令并不会修改destination或source寄存器或内存地址中存储的值,而是通过按位与操作的结果来设置标志寄存器的数值,以便后续指令能够根据标志寄存器中的状态进行分支判断等操作。

下面是一些TEST指令的示例:

  1. 按位与两个寄存器并测试结果

    MOV AX, 0FF00h     ; 将0FF00h存储到AX寄存器中
    TEST AX, 0F0Fh     ; 将AX寄存器中的值与0F0Fh按位与,并根据结果设置标志寄存器的数值
    

    这个示例将AX寄存器中的高字节清零,只保留了低字节中的高4位,并测试了这四位是否为非零值。

  2. 按位与一个寄存器和一个内存地址并测试结果

    MOV EBX, [ESI]     ; 将ESI地址处存储的值读取到EBX寄存器中
    TEST EBX, 0FFh     ; 将EBX寄存器中的值与0FFh按位与,并根据结果设置标志寄存器的数值
    

    这个示例将EBX寄存器中的高字节清零,只保留了低字节中的8位,并测试了这8位是否为非零值。

  3. 按位与两个内存地址并测试结果

    MOV EDI, OFFSET array1   ; 将array1的内存地址存储到EDI寄存器中
    MOV ESI, OFFSET array2   ; 将array2的内存地址存储到ESI寄存器中
    TEST DWORD PTR [EDI], DWORD PTR [ESI]  ; 将array1和array2中相同偏移量处的值按位与,并根据结果设置标志寄存器的数值
    

    这个示例将array1数组中相同偏移量处的值与array2数组中相同偏移量处的值进行按位与操作,并测试操作结果是否为非零值。

NOT指令

NOT指令是x86架构中的一种汇编指令,用于执行按位取反(bitwise not)操作。其语法格式为:

NOT destination

其中,destination可以是寄存器或内存地址。执行完毕后,将destination进行按位取反(bitwise not)操作,并将结果存储回destination中。

下面是一些NOT指令的示例:

  1. 对一个寄存器进行按位取反

    MOV AX, 0FF00h     ; 将0FF00h存储到AX寄存器中
    NOT AX             ; 对AX寄存器中的值进行按位取反,并将结果存储回AX寄存器中
    

    这个示例将AX寄存器中的低字节设置为0x00,高字节设置为0x0F。

  2. 对一个内存地址进行按位取反

    MOV ESI, OFFSET array   ; 将array的内存地址存储到ESI寄存器中
    NOT DWORD PTR [ESI]     ; 对array数组中第一个元素的值进行按位取反,并将结果存储回该元素中
    

    这个示例将array数组中第一个元素的每一位进行取反操作。

  3. 对两个内存地址进行按位取反并测试结果

    MOV EDI, OFFSET array1   ; 将array1的内存地址存储到EDI寄存器中
    MOV ESI, OFFSET array2   ; 将array2的内存地址存储到ESI寄存器中
    NOT DWORD PTR [EDI]      ; 对array1数组中第一个元素的值进行按位取反,并将结果存储回该元素中
    TEST DWORD PTR [EDI], DWORD PTR [ESI]   ; 测试array1数组中第一个元素的值是否与array2数组中相同偏移量处的值按位与后等于0
    

    这个示例将array1数组中第一个元素的每一位进行取反操作,然后测试操作结果是否与array2数组中相同偏移量处的值按位与后等于0,即测试这两个数组在此位置上是否具有相反的位模式。

交换指令

xchg

xchg是一个汇编指令,用于交换操作数的值。它是"exchange"的缩写。xchg指令可以用于不同的用途,包括在并发编程中实现原子操作和同步。

在x86架构的汇编语言中,xchg指令的基本语法如下:

xchg destination, source

其中,destinationsource是操作数。xchg指令执行时,它会将destinationsource的值进行交换。

xchg指令可以应用于不同的操作数类型,如寄存器、内存地址或寄存器与内存地址之间的交换。

以下是一些示例:

  1. 交换两个寄存器的值:
xchg eax, ebx

这将交换寄存器eaxebx中的值。

  1. 交换寄存器和内存地址中的值:
xchg eax, [ebx]

这将交换寄存器eax中的值和存储在内存地址[ebx]中的值。

在并发编程中,xchg指令通常用于实现原子操作和同步。例如,可以使用xchg指令来实现无锁算法中的原子比较交换(compare-and-swap)操作,用于确保数据的原子性更新。xchg指令的原子性保证了操作的不可分割性,以避免竞态条件和数据不一致的问题。

需要注意的是,随着现代处理器的发展,更高级的原子操作指令(如lock cmpxchg)和专用的并发编程工具(如原子类型和锁)已经取代了直接使用xchg指令来实现并发控制。这些工具提供了更高效和更可靠的方式来实现并发操作和同步。

比较指令

CMP指令

CMP(比较)指令是x86汇编语言中的一个指令,用于比较两个操作数的大小。具体来说,CMP指令会将两个操作数相减,并根据减法结果设置标志寄存器中的标志位。这些标志位可以用于控制程序的执行流程。

CMP指令的语法格式如下:

CMP destination, source

其中,destination表示目标操作数,可以是寄存器或内存地址;source表示源操作数,可以是寄存器、内存地址或立即数。指令的作用是将destination减去source的值,并根据减法结果设置标志寄存器中的标志位。

CMP指令会设置以下标志位:

  • CF(进位标志位):如果减法结果产生了进位,则为1,否则为0。
  • ZF(零标志位):如果减法结果等于0,则为1,否则为0。
  • SF(符号标志位):如果减法结果为负,则为1,否则为0。
  • OF(溢出标志位):如果减法结果溢出,则为1,否则为0。

CMP指令常与条件转移指令(如JEJNE等)配合使用,用于根据标志位的值决定程序的执行流程。例如,可以使用CMP指令比较两个数的大小,并根据比较结果决定程序跳转到哪条指令执行。

跳转指令

条件跳转指令

条件跳转指令是x86汇编中的一类指令,用于根据标志寄存器(FLAGS寄存器)的数值进行分支判断,根据条件的成立与否来跳转到不同的代码块中执行。根据判断条件的不同,x86汇编提供了多种条件跳转指令。

常见的条件跳转指令及其含义如下:

  • JE(Jump if Equal):如果上一个比较操作的结果为相等,则跳转。
  • JNE(Jump if Not Equal):如果上一个比较操作的结果为不相等,则跳转。
  • JL(Jump if Less):如果上一个比较操作的结果为小于,则跳转。
  • JLE(Jump if Less or Equal):如果上一个比较操作的结果为小于或等于,则跳转。
  • JG(Jump if Greater):如果上一个比较操作的结果为大于,则跳转。
  • JGE(Jump if Greater or Equal):如果上一个比较操作的结果为大于或等于,则跳转。
  • JA(Jump if Above):如果上一个比较操作的结果为无符号数大于,则跳转。
  • JAE(Jump if Above or Equal):如果上一个比较操作的结果为无符号数大于或等于,则跳转。
  • JB(Jump if Below):如果上一个比较操作的结果为无符号数小于,则跳转。
  • JBE(Jump if Below or Equal):如果上一个比较操作的结果为无符号数小于或等于,则跳转。
  • JZ(Jump if Zero):如果上一个操作的结果为0,则跳转。
  • JNZ(Jump if Not Zero):如果上一个操作的结果不为0,则跳转。

这些条件跳转指令通常搭配其他指令使用,例如CMP(Compare)指令用于比较两个操作数,并根据比较结果设置标志寄存器的数值。然后条件跳转指令可以根据标志寄存器中的状态进行分支判断,决定是否跳转到指定的代码块中执行。

下面是一个简单的示例程序,演示了如何使用条件跳转指令:

MOV AX, 10    ; 将10存储到AX寄存器中
MOV BX, 20    ; 将20存储到BX寄存器中
CMP AX, BX    ; 比较AX和BX的值,设置标志寄存器的数值
JL less       ; 如果AX < BX,则跳转到less标签处
JMP done      ; 否则跳转到done标签处

less:         ; less标签处的指令
MOV CX, 30    ; 将30存储到CX寄存器中
JMP done      ; 跳转到done标签处

done:         ; done标签处的指令
...           ; 继续执行后续指令

在这个示例中,首先将10和20存储到AX和BX寄存器中,然后使用CMP指令比较它们的值,并设置标志寄存器的数值。接着使用JL指令进行分支判断,如果AX < BX,则跳转到less标签处执行MOV指令,否则直接跳转到done标签处。最后在done标签处继续执行后续的指令。

无条件跳转指令

JMP指令是x86汇编中的一种无条件跳转指令,用于直接跳转到程序中的另一个位置执行指令。其语法格式为:

JMP destination

其中,destination可以是任何有效的内存地址或标号(label)。执行完这条指令后,CPU会立即跳转到destination指向的内存地址处执行指令。

下面是一些JMP指令的示例:

  1. 跳转到一个标号处

    START:      ; 定义START标号处的指令
    ...
    JMP START   ; 跳转到START标号处继续执行后续指令
    ...
    

    在这个示例中,定义了一个名为START的标号,表示程序中的某个位置。然后使用JMP指令跳转到START标号处继续执行后续指令。

  2. 跳转到一个内存地址处

    MOV EAX, offset myCode   ; 将myCode的内存地址存储到EAX寄存器中
    JMP EAX                  ; 跳转到myCode所在的内存地址处执行指令
    

    在这个示例中,使用MOV指令将myCode的内存地址存储到EAX寄存器中,然后使用JMP指令直接跳转到myCode所在的内存地址处执行指令。

  3. 使用相对偏移量进行跳转

    MOV EBX, offset labelB  ; 将labelB的内存地址存储到EBX寄存器中
    MOV EAX, offset labelA  ; 将labelA的内存地址存储到EAX寄存器中
    SUB EBX, EAX             ; 计算labelB与labelA之间的相对偏移量
    JMP EBX                  ; 跳转到labelB处执行指令
    ...
    labelA:                  ; 标记labelA处的指令
    ...
    labelB:                  ; 标记labelB处的指令
    ...
    

    在这个示例中,首先使用MOV指令将labelA和labelB的内存地址存储到EAX和EBX寄存器中,然后使用SUB指令计算出labelB与labelA之间的相对偏移量,并将其存储回EBX寄存器中。最后使用JMP指令直接跳转到labelB处执行指令。注意,在这个示例中,需要定义labelA和labelB两个标号,以便计算相对偏移量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

asm:常见指令大全 的相关文章

  • ARM 64 协程切换上下文的汇编代码解读

    ARM 64协程切换上下文的汇编代码解读 贺志国 2023 8 11 在ARM 64位架构中 有一组通用寄存器 General Purpose Registers 一组浮点寄存器 Floating point Registers 和一组特殊
  • 汇编: mul乘法指令(字乘法结果在dx:ax中,8位乘法:一个乘数默认放在al中)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net m0 37564426 article details 85563170
  • 【8086汇编】字符串逆序的实现,附代码

    目录 引言 题目 程序思想 程序例程 程序结果 改进思路 引言 之前有本科的同学需要做一个汇编程序 简单补了补发现自己会嘻嘻嘻 题目 题目 从键盘输入任一字符串 字符数 gt 1 在下一行以相反的次序显示出来 如 输入字符串123abc 在
  • X64处理器架构

    X64处理器架构 翻译的windbg帮助文档 X64处理器架构 X64 架构是一个向后兼容的扩展的 x86 提供了和 x86 相同的 32 位模式和一个新的 64 位模式 术语 x64 包括 AMD 64 和 Intel64 他们的指令集基
  • Linux系统调用指南

    Linux系统调用指南 文章是转载 但是我在后面的案例加了不少注解并debug了 如有疑问 留言交流 其实我也不懂 原文链接 blog packagecloud io https zcfy cc article the definitive
  • 我的程序员之路进行中

    计划看的书 1 Windows程序设计 第5版珍藏版 1104页 2 Windows程序设计 第2版 王艳平 扫描版 490页 3 Windows核心编程 第5版 769页 4 竹林蹊径 深入浅出windows驱动开发 506页 5 Win
  • ARM 汇编基础知识

    1 为什么学习汇编 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编 因为 Cortex A 芯片一 上电 SP 指针还没初始化 C 环境还没准备好 所以肯定不能运行 C 代码 必须先用汇编语言设置好 C 环境 比如
  • arm汇编指令详细整理及实例详解

    目录 一 简介 二 ARM 汇编指令说明 2 1 32位数据操作指令 2 2 32位存储器数据传送指令 2 3 32位转移指令 2 4 其它32位指令 三 实例讲解 3 1 MRS 3 2 MSR 3 3 PRIMASK 3 4 FAULT
  • 汇编——寄存器的分类和功能

    在汇编中 个人感觉最重要的部分其实就是寄存器了 这次我们了解一下寄存器的分类和功能 先说一下寄存器是什么吧 其实就是一部分的空间 我们可以使用这些空间来存储内容 寄存器的空间都是16位的 80x86中 后来有增长 也就是1个字的空间 堆栈则
  • 第二章实验1

    周末没事正好练习下 前边 r原以为是只查看cpu寄存器内容 原来还有修改的意思 只用r即查询 用r 寄存器 则是修改该寄存器 不只是可以修改ax 可以修改其他寄存器 d 段地址 偏移地址 查看内存内容 最左边是每行的起始地址 中间是从指定内
  • 汇编语言+IDA安装问题解决汇总

    利用汇编语言计算机和人类链接更为便捷如下图所示 寄存器 简单讲就是CPU可以存储数据的器件 一个CPU可以有多个寄存器 AX BX是两个不同的寄存器 16位处理器有14个寄存器 AX BX CX DX SI DI SP BP IP CS S
  • Base64编码(汇编版,未做过多优化,性能自认为还可以)

    感谢 DelphiGuy 于 2010 10 08 17 27 37 给出的提醒 function GetSizeCoder3To4 InputCount Integer Integer inline begin Result InputC
  • asm:常用语法

    常用语法 1 循环 1 1 使用条件跳转指令实现循环 1 2 使用LOOP指令实现循环 2 字符串 2 1 指定字符串的长度 2 2 字符串指令 2 3 重复前缀 3 数组 4 递归 5 宏 6 文件操作 7 内存管理 1 循环 1 1 使
  • 智能合约概述——以太坊虚拟机

    以太坊虚拟机 概述 以太坊虚拟机 EVM 是智能合约的运行环境 它不仅是沙盒封装的 而且是完全隔离的 也就是说在 EVM 中运行代码是无法访问网络 文件系统和其他进程的 甚至智能合约之间的访问也是受限的 账户 以太坊中有两类账户 它们共用同
  • 常见汇编指令整理

    本文会整理在逆向中常见的指令汇总 目录 汇编符号 汇编指令的组成 mov movzx lea xchg 加法指令 减法指令 带进位加法 带进位减法 自增自减 乘法运算 除法运算 and or xor not shl shr 逻辑指令 字符串
  • 汇编——单字符输入输出+字符串输入输出(换行实现)

    单字符输入输出 默认采用ML6 11汇编程序 DATAS SEGMENT CHAR DB CHAR存储输入的字符 CHANGELINE DB 13 10 用来表示换行符 DATAS ENDS STACKS SEGMENT DB 128 DU
  • 寻址模式

    寻址模式 代码后补 立即 数 寻址 指令中的形式地址部分 不是操作数的地址 而是操作数本身 特点 指令执行阶段CPU不访问主存 而形式地址的位数限制了立即数的范围 直接寻址 指令中的形式地址部分就是操作数的实际地址 特点 在执行阶段访问了一
  • x86寄存器

    通用寄存器 GPR寄存器 AX Accumulator 累加寄存器 也叫累加器 BX Base 基地址寄存器 CX Count 计数器寄存器 DX Data 数据寄存器 指针寄存器 SP Stack Pointer 堆栈指针寄存器 BP B
  • 用汇编语言实现结构体的输入和保存

    COUNT EQU 1 ALL INPUT MACRO STRING NUM FUNCTION MOV DX OFFSET STRING MOV AH 9H INT 21H MOV DI OFFSET INFO NUM MOV AX SIZ
  • [原创]C++98升级到C++20的复习旅途-从汇编及逆向角度去分析“constexpr“关键字

    简介 常用网名 猪头三 出生日期 1981 XX XX QQ 643439947 个人网站 80x86汇编小站 https www x86asm org 编程生涯 2001年 至今 共22年 职业生涯 20年 开发语言 C C 80x86A

随机推荐

  • bp神经网络的训练方法,一文搞定bp神经网络

    BP人工神经网络方法 一 方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统 理论和实践表明 在信息处理方面 神经网络方法比传统模式识别方法更具有优势 人工神经元是神经网络的基本处理单元 其接收的信
  • -day17 面向对象基础

    第三模块 面向对象 网络 并发编程 此模块包含如下三大部分知识 面向对象 Python中支持两种编程方式来写代码 分别是 函数式编程 面向对象式编程 函数式 定义函数 在函数中实现功能 def func print 一个功能 执行函数 fu
  • mysql高可用分库分表ShardingSphere之Sharding-proxy

    文章目录 一 ShardingSphere 1 1 官网地址说明 1 2 为什么分库分表 二 官网整合说明 1 1 下载sharding proxy 1 2 sharding proxy集成注册中心 1 3 查看配置手册 1 3 1 官网数
  • C++ 快速排序

    快速排序是比较常用的一种排序 平均时间复杂度为O nlogn 最坏的时间复杂度为O n 话不多说 上代码 include
  • [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章开启了新的内容 Bert 首先介绍Keras bert库安装及基础用法 这将为后续文本分类 命名实体识别提供帮助 这篇文章将通过keras bert库构建
  • 【C++】异常

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 异常 1 C语言处理异常的方式 2 C 处理异常的方式
  • MyBatis 中if 标签 判断字符串不生效

    今天遇到if 标签判断字符串不生效 导致查询结果错误 异常sql 的mapper 文件
  • Ubuntu14.04安装ssh实现远程登陆

    Ubuntu14 04安装ssh实现远程登陆 安装 sudo apt get install y ssh 修改ubuntu的ip地址和PC在同一网段内 配置 sudo gedit etc ssh sshd config 修改成如下设置 重启
  • C++给变量起别名

    以下代码展示给变量a取一个别名b 两者指向同一个内存空间位置 改变b a也会相应改变 include
  • AR模型脱卡,unity端实现步骤详情

    AR模型脱卡unity端实现具体步骤 AR模型脱卡的原理 利用一些unity端AR插件做AR应用 通常会有一个需求 当识别物消失的时候 将3D模型从识别物这个父物体上移除 显示在屏幕中央 那么原理就显而易见了 就是在识别物追踪方法中 写一些
  • Pytorch固定部分参数(只训练部分层)

    参考 https www cnblogs com jiangkejie p 11199847 html 在迁移学习中我们经常会用到预训练模型 并在预训练模型的基础上添加额外层 训练时先将预训练层参数固定 只训练额外添加的部分 完了之后再全部
  • 字节对齐和字节序

    1 字节对齐 1 什么是字节对齐 内存空间是按字节划分 理论上可以从任意起始地址访问任意类型的变量 但实际上在访问特定类型变量是经常在特定的内存地址访问 这就需要各种数据类型按照一定的规则进行排列 而不是一个接一个紧接着排放 简单的讲就是数
  • C++拷贝构造函数—类临时对象的构建与析构

    一 对象的概念 对象的基本概念 我们最开始学习数据类型的时候 我们会学到 int a 10 这种写法 这种写法是数据类型 标识符的形式 标识符来给我们程序运行中需要使用到的内存空间取名字 这个标识符一般指的是变量 而利用常量来对我们向系统申
  • 针对“PL2303HXA自2012已停产,请联系供货商”问题的解决办法

    连接nanopi友善之臂时遇到这种情况 首先尝试更新驱动程序 在更新驱动程序后当时可以正常用putty连接板子 但在第二天又出现了这个问题 其实就是驱动程序太新了 安装旧版驱动程序就可以 查看现在的驱动程序版本 是2021年的 打开设备管理
  • 全网最详细中英文ChatGPT-GPT-4示例文档-语句情绪分类从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    从0到1快速入门语句情绪分类应用场景 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node js接口请求示例 cu
  • android从一个应用跳转到另一个应用

    获取launcher中的应用列表 Intent intent new Intent intent setAction Intent ACTION MAIN intent addCategory Intent CATEGORY LAUNCHE
  • 奇异谱分解轴承故障诊断代码编写

    答 我可以为您提供一些建议 以帮助您编写奇异谱分解轴承故障诊断代码 1 首先 要确定故障类型 以便确定诊断策略 2 然后 可以使用多种故障诊断技术 包括奇异谱分析 以及其他故障诊断技术 3 为了更好地掌握故障特征 可以使用相关的轴承数据库
  • 最近在学动态规划,很有意思的算法(1)拿金币

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • 代码扫描工具对比

    1 概述 随着网络的飞速发展 各种网络应用不断成熟 各种开发技术层出不穷 上网已经成为人们日常生活中的一个重要组成部分 在享受互联网带来的各种方便之处的同时 安全问题也变得越来越重要 黑客 病毒 木马等不断攻击着各种网站 如何保证网站的安全
  • asm:常见指令大全

    常见指令大全 算数指令 INC 指令 DEC 指令 ADD 指令 SUB指令 MUL指令 IMUL指令 DIV指令 IDIV指令 逻辑指令 AND指令 OR指令 XOR 指令 TEST指令 NOT指令 交换指令 xchg 比较指令 CMP指