X86汇编语言:从实模式到保护模式–命令篇
补充汇编命令
注:不能直接将内存赋值给内存,也不能将立即数直接赋值给段寄存器(CS DS ES SS),但是可以将内存直接赋值给段寄存器
- div:使用操作数作为除数,除以被除数(无符号除法)。
- 如果除数的长度为8位,则只使用AX作为被除数,执行除法后商存储在AL中,余数存储在AH中。
- 如果除数的长度为16位,则使用DX:AX作为被除数,执行除法后商存储在AX中,余数存储在DX中。
- idiv:有符号除法
mov ax, 0x0400
mov bl, 0xf0
idiv bl
- sub:
sub ah, al
;可以等价为如下
neg al
add ah, al
-
neg:用0减去指令中指定的操作数
-
cmp:比较两个数,如果相等则将ZF置1,否则置0。
-
cbw(Convert Byte to Word):将字节扩展至字
-
cwd(Convert Word to Double-word):将字扩展至双字
-
jns:条件转移指令,执行时要参考标志寄存器的符号位SF,如果SF不为1则跳转,否则不跳转
-
jmp指令
- jcxz:当CX寄存器内容为0时进行转移。
- jmp short xxx:相对短转移,操作码位0xEB,该指令属于段内转移指令,长度为2字节,只允许-128–127字节的地方。
- jmp near xxxx:16位相对近转移,操作码0xE9,是段内转移,长度位3字节,转移范围为-32768–32767。
- jmp (near) xxxx:16位简介绝对近转移,由16位通用寄存器博保存。jmp near bx, jmp near cx,jmp [bx+si]
- jmp 0x0000:0x7c00:16位直接绝对远转移(字节码EA 00 7C 00 00),直接给出段地址和偏移地址。
- jmp far [0x04]:该指令执行时,会访问段寄存器DS所指向的数据段,并从0X04偏移地址处取出两个字保存至IP和CS中(低地址[0x04–0x05]保存了IP,高地址[0x06-0x07]保存了CS)
-
call:
- call near (标号或者立即数):16位相对近调用,当前代码段内的call,near不是必须的
call 0x5000 -> E8 xxxx call proc_1
- call (寄存器或者内存地址):16位简介绝对调用,也是一种近调用,只能调用当前代码段内的过程,指令中的操作数不是偏移量,二十被调用过程的真实地址,故称为绝对调用。需要用16位通用寄存器或者16位内存单元给出。(可以调用当前代码段内的任意一个过程,不像相对近调用只能调用-32768到32767字节范围的数据)
call cx -> FF D1 call [0x3000] -> FF 16 00 30 call [bx] call [bx + si + 0x02]
- call :直接绝对远调用,段间调用。
call 0x2000:0x0030 ->9A 30 00 00 20
- call :16位简介绝对远调用,也属于段间调用,被第哦啊用过程位于另一个代码段中
call far [0x2000] call far [proc_1] ;执行这句的时候处理器会从段寄存器DS指向的数据段,结合指令中的偏移地址,取出两个字。以此取代CS个IP内的值。 call far [bx] call far [bx + si]
- call near (标号或者立即数):16位相对近调用,当前代码段内的call,near不是必须的
-
ret和retf:与call和call far配对。
- ret是近返回指令,处理器从堆栈中弹出一个字到IP中。
- retf是远返回指令,处理器分别弹出两个字到IP和CS中。
-
shr:逻辑右移指令文章来源:https://www.toymoban.com/news/detail-755786.html
-
shl:逻辑左移指令文章来源地址https://www.toymoban.com/news/detail-755786.html
伪指令
-
- resb:从当前位置开始,保留指定数量的字节,但不初始化。
- resw:声明未初始化的字
- resd:声明未初始化的双字
到了这里,关于X86汇编语言:从实模式到保护模式--命令篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!