同时修改CS和IP:
JMP
段地址:偏移地址
只修改IP内容:
JMP
某一合法寄存器
DEBUG操作:
R:查看、修改寄存器内容 R
D:查看内存中的内容 D 段地址:便宜地址
E:修改内存中的内容 E 段地址:偏移地址・・・・数据・・・・
U:将数据解析对应汇编
T:执行CS:IP处的指令
A:向内存形式写入汇编指令
P
ush 寄存器 ;将一个寄存器的数据入栈。
SP=SP-2 向SS:IP送入数据
Pop 寄存器; 出栈,寄存器接受出栈的内容
从SS:IP读取数据 SP=SP+2
SS和SP存放栈顶的段地址和偏移地址
DS数据,CS:IP代码,SS:IP栈段。
编译步骤:
1.
编译,打开masm.exe输入ASM源文件的路径
2.
连接,打开link.exe打开1生成的连接文件,obj扩展名的。输入路径。
mov cs,循环的次数
s:
循环执行的程序段
L
oop s
程序框架:
A
ssume cs:code
C
ode segment
数据・・・・
S
tart:
代码・・・
C
ode ends
E
nd start
A
nd 和 or指令
A
nd指令:逻辑与指令,按位进行运算,有0为0,可以将操作对象的相应位设置为0,其他位不变。
al=0011 0101b
and al, 1101 1111b =0001 0101
or指令:逻辑或指令,按位进行或运算。可以将操作的相应位设置为1,其他位不变。
A
l=0001 0101
O
r al, 0100 0000 = 0101 0101
BP寄存器和BX寄存器相视
指令要处理的数据有多长
word ptr 指明了指令访问的内存单元是一个字单元
byte ptr 指明了指令访问的内存单元是一个字节单元
div除法指令
AX(16位) / 8位 = AL(商)・・・AH(余数)
【DX(高位)AX(低位)】 / 16位 = AX(商)・・・DX(余数)
db和dw dd定义数据
db字节, dw 字 ,dd双字
dup是一个操作符
db 3 dup (0) 定义了3个字节0,0,0
db 3 dup(0,1,2)定义了9个字节0,1,2,0,1,2,0,1,2
格式:
db 重复的次数 dup (重复的字节数据)
dw 重复的次数 dup (重复的字数据)
db 重复的次数 dup (重复的双字数据)
转移指令:
依据位移进行转移:
jmp shor 标号(转移到标号处执行指令)
段内短转移,IP的修改范围-127~127
IP=(IP)+8位位移
8位位移=标号-jmp指令后的第一个字节的地址。8位位移用补码表示,由编译程序在编译时算出。
jmp near ptr 标号
它实现的是段内近转移
(IP)=(IP)+16位位移
16位移=标号处的地址-jmp指令后的第一个字节的地址
Near
ptr 指明此处的位移为16位位移,进行的是段内近转移
修改范围-32768~32767
转移的目的地址在指令中:
J
mp far ptr 标号
实现的是段间转移,又称远转移
(CS)=标号所在段的地址;(IP)=标号在段中的偏移地址。
far ptr 指明了指令用标号的段地址和偏移地址修改CS和IP.。
转移地址在寄存器中:
jmp 16位寄存器
(IP)=(16位寄存器)
转移指令在内存中:
jmp word ptr
内存单元地址(段内转移)
功能:从内存单元地址处存放一个字,是转移的目的偏移地址。
jmp dword ptr 内存单元地址(段间转移)
功能:存放两个字,高位目的地址,低位偏移地址
CS=(内存单元地址+2)
IP=(内存单元地址)
J
cxz指令
有条件转移指令,所有的有条件转移指令都是短转移,对应机器码中包含转移的位移,而不是目的地址。
J
cxz 标号(如果cx=0,转移到标号处执行)
操作:当cx=0是,IP=IP+8位位移
8位位移=标号处的地址-jcxz指令后的第一个字节的地址
8位位移的范围-128~127,用补码表示
L
oop指令
L
oop 标号(CX=CX-1),如果CX不等0,转移到标号处执行
CX=XC-1
CX不等0,IP=IP+8位位移
R
et和retf指令
R
et指令用栈中的数据,修改IP的内容,从而实现近转移。
R
etf指令用栈中的数据,修改CS和IP的内容,从而实现近转移。
R
et:
IP=CS*16+SP
SP=SP+2
R
etf:
IP=SS*16+SP
SP+2
CS=SS*16+SP
SP=SP+2
CALL指令
将当前的IP或CS和IP压入栈中,转移。相当:
PUSH IP
JMP NEAR PTR 标号
C
all far ptr 标号,实现的是段间转移
SP=SP-2
SS*16+SP=CS
SP=SP-2
SS*16+SP=IP
相当:
PUSH CS
PUSH IP
JMP FAR PTR 标号
C
all 16位寄存器
SP=SP-2
SS*16+SP=IP
IP=16位寄存器
相当:
PUSH IP
JMP 16位寄存器
C
all word ptr 内存单元地址
相当于:
PUSH IP
JMP WORD PTR 内存单元地址
C
all dword ptr 内存单元地址
相当于:
P
ush cs
P
ush ip
J
mp dword ptr 内存单元地址
C
all和ret的配合使用
A
ssume cs:code
C
ode segment
M
ain:
:
C
all sub1
:
:
M
ov ax,4c00h
I
nt 21h
S
ub1::
:
R
et
C
ode ends
E
nd main
M
ul指令乘法
AL(8位)=5
M
ul 6( 8位)
AX=积30
AX(16位)=30
M
ul 44 (16位)
D
S=积高位,AX=积低位
标志寄存器flag
ZF
标志
ZF=1,结果等于0
ZF=0,结果不等于0
PF标志
PF=0,最低有效字节bit位中1的个数为奇
PF=1,最低有效字节bit位中1的个数为偶
SF标志
SF=1,结果为负
SF=0,结果不为负
有符号运算采用意义,无符号运算虽然可以改变SF的值,但是没有意义。
CF标志
记录无符号运算的最高有效位,向更高位的进位值,或从更高位的借位值
OF标志
OF=1,有符号运算发生溢出
OF=0,有符号运算没有溢出
adc指令
带位加法,利用了CF位上记录的进位值。
A
dc 操作对象1,操作对象2
操作对象1=操作对象1+操作对象2+CF
S
bb指令
带借位减法指令,利用了CF上记录的借位值。
S
bb操作对象1,操作对象2
操作对象1=操作对象1-操作对象2-CF
C
mp指令
是比较指令,相当于减法指令,只是不保存结果。
C
mp操作对象1,操作对象2
操作对象1-操作对象2,不保存结果,对标志寄存器进行设置。
ZF=1,结果相等
ZF=0,结果不相等
CF=1,ax < bx
CF=0, ax>=0
CF=0,ZF=0, ax>bx
CF=0,ZF=1, ax<=bx
如果SF=1,OF=0,说明没有溢出,结果的正负=实际结果的正负。
以为SF1,实际结果为负数,所以逻辑上真正的结果为负,ah<bh。
如果SF=1,OF=1
OF=1,说明有溢出,逻辑上真正结果的正负不等实际结果的正负;
因为,SF=1,结果为负数。
如果因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正,这样SF=1,OF=1,说明ah>bh.。
如果SF=0,OF=1
OF=1,说明有溢出,逻辑上真正结果的正负不等实际结果的正负;
如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然位负数。
这样,SF=0,OF=1,说明了AH<BH。
如果SF=0,而OF=0
OF=0,说明没有溢出,逻辑上真正的正负=实际结果的正负。
SF=0,实际结果非负,所以逻辑上真正的结果非负,所以AH>=BH。
检查比较结果的条件转移指令
指令 含义 检测的相关标志位
JE 等于则转移 ZF=1
JNE 不等于则转移 ZF=0
JB 低于怎转移 CF=1
JNB 不低于则转移 CF=0
JA 高于则转移 CF=0,ZF=0
JNA 不高于则转移 CF=1,ZF=1
DF标志和串传送指令
DF=0,每次操作后si ,di 递增。
DF=1, 每次操作后si ,di 递减
正序 DF = 0 CLD
倒序 DF = 1 STD
Movsb 常和ret 、cx配合使用
Movsb就是把ds:si的内容传个es:di,si默认段地址是DS,si默认段地址是ES.
SI------->DI
MOV AX, DATA
MOV DS, AX
MOV SI,0
MOV ES, AX
MOV DII16
MOV CX, 18
CLD
REP MOVSB
Pushf和popf
Pushf将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。
Shl和shr指令
Shl和shr是逻辑位移指令
Shl是逻辑左移指令
将一个寄存器或内存单元的数据向左移位
将最后移出的一位写入CF中
最后地位用0补充
如果移动位数大于1时,必须将移动位数放在CL中。
shr是逻辑右移指令,它和shl所进行的操作刚好相反。
将一个寄存器或内存单元的数据向右移位
将最后移出的一位写入CF中
最后地位用0补充
MOV AL,0101 0000
MOV CL,3 移动的3位(移动几位,如果大于1要用CL)
SHL AL, CL
X逻辑左移一位,相当于执行X=X*2
X逻辑右移一位,相当于执行X=X
/
2