汇编记录(99) 汇编指令

mov(赋值) 指令:(mov a,b ,把 b 的数据传送到 a 中)
有以下形式:
1、mov 寄存器,任意(数据、内存单元、寄存器、段寄存器、字符)(mov ax,9 | [1] | bx | ds | ‘a’)
2、mov 内存单元,寄存器 | 段寄存器(mov [2],bx | ds)
3、mov 段寄存器,寄存器 | 内存单元(mov es,ax | [1])


add(加法) 指令:(add a,b ,把 a 的数据与 b 的数据相加的结果放到 a 中)
sub(减法) 指令:(sub a,b ,把 a 的数据减去 b 的数据所得结果放到 a 中)
有以下形式:
1、add | sub 寄存器,数据 | 寄存器 | 内存单元 (add | sub ax,8 | bx | [2])

2、add | sub 内存单元,寄存器(add | sub [0],ax)

div(除法)指令:(div  a ,a 是除数,被除数放在 ax 或 ax 和 dx 中)

1、除数:有 8 位 或 16 位 两种,存放在 reg 或 内存单元中

2、被除数:如果除数是 8 位,被除数是 16 位(被除数是 16 位,除数是 8 位),被除数存放在 ax 中

                      如果除数是 16 位,被除数是 32 位(被除数是 32 位,除数是 16 位,被除数的高位放在 dx 中,低位放在 ax 中)

3、商和余数的存放:如果除数是 8 位,al 存放商,ah 存放余数。如果除数是 16 位,ax 存放商值,dx 存放余数

div byte ptr ds:[a](a 是常量或寄存器中的数值)

商:al = ax / (ds * 10h + a)   余数:ah = ax % (ds * 10h + a)

div word ptr ds:[a]

商:ax = (dx * 10h + ax) / (ds * 10h + a)   余数:dx = (dx * 10h + ax) % (ds * 10h + a)

mul(乘法)指令:(mul a,a 是)

乘数:相乘的数要么都是 8 位,一个数存放在 AL 中,另一个存放在 8 位的 reg 或 内存单元中。要么都是 16 位,一个存放在 16 位的 reg 或 字型内存单元中

结果:如果乘数是 8 位,乘积保存在 AX 中。如果乘数是 16 位,乘积的高字节保存在 DX 中,低字节保存在 AX 中

adc 指令(adc a,b,将 a 和 b 相加后再加上 CF 的“进值”,结果保存到 a 中)

将 CF 标记位参加运算,可以将一个高位数拆分,先进行低字节的运算,进位记录在 CF 中,调用 adc 根据进位对高字节进行运算

如:将 1EF0001000H 和 2010001EF0H 相加,ax 放高位,bx 放次高,cx 放低位。
mov cx,1000H
adc cx,1EF0H // 1000H+ 1EF0H + CF 未产生进位,CF=0
mov bx,F000H
adc bx,1000H // F000H + 1000H + CF 产生进位,CF=1
mov ax,1EH
adc ax,20H // ax= 1EH + 20H + CF(1) = 3FH 

sbb 指令(sbb a,b,将 a 与 b 相减后,在减去 CF 的“借值”,结果保存到 a 中)


and(“与”运算)指令:(and  a,b,把 a 与 b 进行“与”运算,结果放到 a 中)

or(“或”运算)指令:(or  a,b,把 a 与 b 进行“或”运算,结果放到 a 中)

shl(左位移)指令:

格式:

shl 寄存器

shr(右位移)指令:(shr a,b,将 a 的二进制数右移 b 个位数,将最后移出的一位写入 CF 中,高位用 0 填补)


jmp(转移) 指令:(更改 CPU 执行代码的位置,详细内容请看《关于 jmp 汇编指令的详细》)

有以下格式:

1、转移 IP 到指定位置

jmp 寄存器 (设置 IP = 寄存器存放的值)

2、在段内转移 IP 的位置(“差值” =  标记地址 - 该指令后的第一个字节的地址

jmp short 标记(在机器码中用 8 位数据保存差值,设置 IP = IP + 差值)

jmp near ptr 标记(在机器码中用 16 位数据保存差值,设置 IP = IP + 差值)

jmp word ptr 内存单元(设置 IP = 内存字型单元内容)

3、在段间转移 CS:IP 的位置

jmp far ptr 标记(设置 CS=标记的段地址,IP=标记到段地址的偏移量,目的地址被存放在机器码中)

jmp dword ptr 内存单元(设置 CS=高地址字型单元内容,IP=低地址字型单元内容)


call 指令:

CPU 执行该指令,进行两步操作

1、将当前的 IP 或 CS:IP 压入栈  2、跳转

有以下格式:

1、转移 IP 到指定位置

call 寄存器(先将该指令后的第一个字节的 IP 压栈,然后设置 IP = 寄存器存放的内容)

2、段内转移(“差值” = 标记地址 - 该指令后的第一个字节的地址

call 标记(先将该指令后的第一个字节的 IP 压栈,在机器码中用 16 位保存差值,然后设置IP = IP 差值)

call word ptr 内存单元(先将该指令后的第一个字节的 IP 压栈,然后设置 IP = 内存字型单元内容)

3、段间转移

call far ptr 标记(先将该指令后的第一个字节的 CS、IP 分别压栈,然后设置 CS=标记的段地址,IP=标记到段地址的偏移量,目的地址被存放在机器码中)

call dword ptr 内存单元(先将该指令后的第一个字节的 CS、IP 分别压栈,然后设置 CS=高地址字型单元内容,IP=低地址字型单元内容)


ret 指令:(用栈中的数据,修改 IP 内容,从而实现近转移)

CPU 执行该指令,进行两步操作

1、IP = ss:[sp] 2个内存单元内容  2、sp = sp + 2(类似于 pop IP)

格式:ret

retf 指令:(用栈中的数据,修改 CS:IP 的内容,从而实现远转移)

CPU 执行该指令,进行四步操作

1、IP = ss:[sp] 2个内存单元内容  2、sp = sp + 2  3、CS= ss:[sp] 2个内存单元内容  4、sp = sp + 2(类似于 pop IP、pop CS)

格式:retf


push(入栈)指令:(push a 把数据 a 放入栈中)
pop(出栈)指令:(pop a 把数据 a 从栈中读取)
有以下形式:
push | pop 寄存器 | 段寄存器 | 内存单元


loop(循环) 指令:

格式:

标记号:汇编指令

                loop 标记号

loop 返回到标记号,运行次数保存在 cx 中,当 cx 的值为 0 时,退出循环,执行下面的指令


rep (重复)指令:

根据 CX 的值,重复执行 rep 后面的指令


inc(自加 1)指令:(inc a,把 a 中的数据加 1,保存到 a 中)
有以下形式:
inc 寄存器


cmp(判断)指令:

格式:

cmp a,b(该指令会让 CPU 进行 a - b,结果影响 flag 寄存器的位但结果不会保存)


movsb 指令:

该指令会执行两步操作:

1、使 es:[di] 的内存单元 = ds:[si] 的内存单元

2、根据 flag 寄存器中的 DF 位,如果 DF=0,di++,si++,如果 DF=1,di--,si--。

movsw 指令:

基本与 movsb 相似,如果 DF=0,di += 2,si += 2,如果 DF=1,di -= 2,si -= 2。

cld 指令:把 DF 设置为 0

std 指令:把 DF 设置为 1

pushf 指令:把标记寄存器的值压入栈中

popf 指令:把值出栈,送入标记寄存器中

sti 指令:设置 IF = 1

cli 指令:设置 IF = 0


int 指令:引发 CPU 中断,将发送中断码,引发中断过程,把当前 CS:IP 入栈,读取 中断码 * 4 和 中断码 * 4 + 2 的内存地址的内容,设置 CS = [中断码 * 4 + 2]、IP = [中断码 * 4](CS:IP 是指向中断程序)


读写端口的汇编指令:(在使用 in、out 指令时,只能使用 al 或 ax 来读取或写入数据,当读取或写入 8 位数据时,用 al ,当读取或写入 16 位时,用 ax)

in 指令:(in al,20h 向端口号为 20 读取数据,读取的数据放在 al 中) 

out 指令:(out 20h,al 向端口为 20 写入数据,写入的数据放在 al 中)

格式:

对于 0 ~ 255 的端口号进行读写

in al,20h

out 20h,al

对于 256 ~ 65535 的端口进行读写,端口号放在 dx 中

mov dx,3F0h

in ax,dx

out dx,ax

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值