学习文章来源于汇编指令入门级整理-CSDN博客
汇编指令是机器指令的注记符,与机器指令是一一对应的
1.数据传送指令
- MOV 传送指令 MOV dest,src 将数据src移动到dest
//mov时注意数据大小,一个AX寄存器只能存4个16进制数超过4个的部分不会存在AX中add同理
- PUSH 进栈指令 PUSH src 把源操作数sec压入堆栈
- POP 出栈指令 POP desc 从栈顶弹出字数据到dest
//PUSH和POP在c语言中函数调用原理中有涉及
2.算数运算指令
- ADD 加法指令 ADD dest,src 在dest基础上加src并将该值存入dest中
- SUB 减法指令 SUB dest,src 在dest基础上减src并将该值存入dest中
- INC 加1指令 INC dest 在dest基础上加1……
- DEC 减1指令 DEC dest 在dest基础上减1……
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
mov ax,18 | 将18送入寄存器AX | AX=18 |
mov ah,78 | 将78送入寄存器AH | AH=78 |
add ax,8 | 将寄存器AX中的数值加上8 | AX=AX+8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=BX |
add ax,bx | 将AX和BX中的数值相加,结果存在AX中 | AX=AX+BX |
//注:若ax,bx中的数据均为8226H执行 add ax,bx后的值不为1044CH因为ax是16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,所以ax中的数据为:044CH。
一开始al中的数据为C5H,相加后所得的值为158H但是al为8位寄存器,所以最高位1丢失,ax中的数据为0058H。(此处与上一处的丢失只是不能在8(16)位寄存器中保存,但是CPU并不会真的丢弃这个进制值)
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。
3.逻辑运算指令
- NOT 取反运算指令 NOT dest 把操作数dest按位取反
//假设寄存器 AL 的值为 0x5A(二进制表示为 01011010),执行以下指令:
NOT AL
执行后,AL 的值将变为 0xA5(二进制表示为 10100101)。
- AND 与运算指令 AND dest,sec 把dest和src进行运算后送回dest
//按位与(AND)运算的规则是:两个二进制数的对应位进行比较,如果两个对应位都为 1,则结果的该位为 1;否则为 0。
- OR 或运算指令 OR dest,src 把dest和src进行运算后送回dest
//按位或(OR)运算的规则是:两个二进制数的对应位进行比较,如果两个对应位中至少有一个为 1,则结果的该位为 1;否则为 0。
- XOR 异或运算 XOR dest,src 把dest和src进行异或运算之后送回dest
//按位异或(XOR)运算的规则是:两个二进制数的对应位进行比较,如果两个对应位的值不同,则结果的该位为 1;如果相同,则为 0。
4.循环控制指令
- LOOP 计算循环指令 LOOP label 使ECX的值减1,当ECX的值不为0的时候跳转至label,否则执行LOOP之后的语句
//ecx是 x86 架构中的一个通用寄存器
5.转移指令
- JMP 无条件转移指令 JMP lable 无条件地转移到标号为label的位置
- CALL 过程调用指令 CALL labal 直接调用label
- JE 条件转移指令 JE lable zf=1时跳转到标号为label的位置
- JNE 条件转移指令 JNE lable zf=0时跳转到标号为label的位置
//zf 是零标志(Zero Flag)的缩写,它是 CPU 状态寄存器中的一个位。当执行比较或算术运算时,如果结果为零,则 zf 被设置为1;否则,zf 被清除为0。