反汇编指令大全,跪求汇编语语言命令详解
反汇编指令大全,跪求汇编语语言命令详解详细介绍
本文目录一览: 反汇编中的mov,jmp 等是什么意思?列举一下。
mov相当于赋值,如:
MOV A,R1
jmp是无条件跳转,如:
LOOP: mov A,R1
JMP LOOP
下边是一些汇编中的指令后边都有意思!
051指令集
资料转移指令
MOV 移动
MOVC 程式记忆体移动
MOVX 外部RAM和扩展I/O口与累加器A的数据传送指令
PUSH 放入堆叠
POP 由堆叠取回
XCH 8位元交换
XCHD 低4位元交换
SWAP 高低4位元交换
算术指令
ADD 两数相加
ADDC 两数相加再加C
SUBB 两数相减再减C
INC 加一指令
DEC 减一指令
MUL (MUL AB乘法指令仅此一条)相乘指令,所得的16位二进制数低8位存累加器A高8位存B
DIV (DIV AB 除法指令仅此一条)相除指令,所得商存A,余数存B
DA (DA A 只此一条指令)调整为十进数
逻辑指令
ANL做AND(逻辑与)运算
ORL做OR(逻辑或)运算
XRL 做(逻辑异或)运算
CLR 清除为0
CPL 取反指令
RL 不带进位左环移
RLC 带进位左环移
RR 不带进位右环移
RRC 带进位右环移
控制转移类指令
JC C=1时跳
JNC C=0时跳
JB 位元=1时跳
JNB 位元=0时跳
JBC 位元=1时跳且清除此位元
LCALL 长调用子程序
ACALL 绝对调用子程序
RET 由副程式返回
RETI 由中断副程式返回
AJMP 绝对转移
SJMP 相对转移
JMP @A+DPTR 散转,相对DPTR的间接转移
JZ A=0时跳
JNZA 0时跳
CJNE 二数比较,不相等时跳
DJNZ 减一,不等於0时跳
NOP 空操作
位变量指令
SETB 设定为1
ORG 程序开始,规定程序的起始地址
END 程序结束
EQU 等值指令(先赋值后使用)例:SUM EQU 30H
DB 定义字节指令
DW 定义字内容
DS 定义保留一定的存贮单元数目
BIT 位地址符号指令 例:SAM BIT P1.0
RET 子程序返回指令
RETI 中断子程序返回指令
$ 本条指令地址
算术运算指令
指令 说明 周期
ADD A,Rn A←A+Rn 12
ADD A,direct A←A+direct 12
ADD A,@Ri A←A+Ri 12
ADD A,#data A←A+data 12
ADDC A,Rn A←A+Rn+C 12
ADDC A,direct A←A+direct+C 12
ADDC A,@Ri A←A+Ri+C 12
ADDC A,#data A←A+data+C 12
SUBB A,Rn A←A-Rn-C 12
SUBB A,direct A←A-direct-C 12
SUBB A,@Ri A←A-Ri-C 12
SUBB A,#data A←A-data-C 12
INC A A←A+1 12
INC Rn Rn←Rn+1 12
INC direct direct←direct+1 12
INC @Ri @Ri←@Ri+1 12
INC DPTR DPTR←DPTR+1 12
DEC A A←A-1 12
DEC Rn Rn←Rn-1 12
DEC direct direct←direct-1 12
DEC @Ri @Ri←@Ri-1 12
MUL AB 两个无符号的8位数据相乘,其中高阶8位放入B缓存器,低阶8位则放入累积器ACC 24
DIV AB 两个无符号的8位数据相除,把ACC值除以B缓存器值,商数放回ACC,余数放在B 48
DA A 累加器作十进制调整 48
逻辑运算指令
指令 说明 周期
ANL A,Rn A←A and Rn 12
ANL A,direct A←A and direct 12
ANL A,@Ri A←A and Ri 12
ANL A,#data A←A and data 12
ANL direct,A direct←direct and A 12
ANL direct,#data direct←direct and data 24
ORL A,Rn A←A or Rn 12
ORL A,direct A←A or direct 12
ORL A,Rn A←A or Rn 12
ORL A,@Ri A←A or Ri 12
ORL A,#data A←A or data 12
ORL direct,A direct←direct or A 12
ORL direct,#data direct←direct or data 24
XRL A,Rn A←A xor Rn 12
XRL A,direct A←A xor direct 12
XRL A,@Ri A←A xor Ri 12
XRL A,#data A←A xor data 12
XRL direct,A direct←direct xor A 12
XRL direct,#data direct←direct xor data 12
CLR A 清除累加器 12
CPL A 累加器反相 12
RL A 累加器向左旋转 12
RLC A 累加器和C左旋 12
RR A 累加器向右旋转 12
RRC A 累加器和C右旋 12
SWAP A 累加器的高低四位互换 12
数据转移指令
指令 说明 周期
MOV A,Rn A←Rn 12
MOV A,direct A←direct 12
MOV A,@Ri A←Ri 12
MOV A,#data A←data 12
MOV Rn,A Rn←A 12
MOV Rn,direct Rn←direct 24
MOV Rn,#data Rn←data 12
MOV direct,A direct←A 12
MOV direct,Rn direct←Rn 24
MOV direct,direct direct←direct 24
MOV direct,@Ri direct←Ri 24
MOV direct,#data direct←data 24
MOV @Ri,A Ri←A 12
MOV @Ri,direct Ri←direct 24
MOV @Ri,#data Ri←data 12
MOV DPTR,#data 16 Ri←16bit data 24
MOVC A,@A+DPTR A←程序内存的数据 24
MOVC A,@A+PC A←程序内存的数据 24
MOVX A,@Ri A←外部RAM的数据(8bit地址) 24
MOVX A,@DPTR A←外部RAM的数据(16bit地址) 24
MOVX @Ri,A 外部的RAM(8bit)←A 24
MOVX @DPTR,A 外部的RAM(16bit)←A 24
PUSH direc 推迭区←direct 24
POP direc direct←堆栈区 24
XCH A,Rn A和Rn互换 12
XCH A,direct A和direct互换 12
XCH A,@Ri A和Ri互换 12
XCHD A,@Ri A和Ri的低四位互换 12
位运算指令
指令 说明 周期
CLR C 清除进位旗标 12
CLR bit 清除直接位 12
SETB C 设定进位旗标 12
SETB bit 设定直接位 12
CPL C 进位旗标反相 12
CPL bit 直接位反相 12
ANL C,bit C←C and bit 24
ANL C,/bit C←C and bit(反相) 24
ORL C,bit C←C or bit 24
ORL C,/bit C←C or bit(反相) 24
MOV C,bit C←bit 12
MOV bit,C bit←C 24
JC rel 若C=1跳至rel 24
JNC rel 若C=0跳至rel 24
JB bit,rel 若bit=1跳至rel 24
JNB bit,rel 若bit=0跳至rel 24
JBC bit,rel 若bit=1跳至rel,且清除此位 24
程序跳跃指令
指令 说明 周期
ACALL addr11 绝对式子程序呼叫 24
LCALL addr16 远程子程序呼叫 24
RET 从子程序返回 24
RETI 从中断子程序返回 24
AJMP addr11 绝对式跳跃 24
LJMP addr16 远程跳跃 24
SJMP rel 短程跳跃 24
JMP @A+DPTR 间接跳跃 24
JZ rel 若A=0跳至rel 24
JNZ rel 若A不等于0跳至rel 24
CJNE A,direct,rel 若A不等于direct跳至rel 24
CJNE A,#data,rel 若A不等于data跳至rel 24
CJNE Rn,#data,rel 若Rn不等于data跳至rel 24
CJNE @Ri,#data,rel 若Ri不等于data跳至rel 24
DJNZ Rn,rel Rn减1不等于0跳至rel 24
DJNZ direct,rel direct减1不等于0跳至rel 24
NOP 没动作 12
缩写符号说明
缩写符号 说明 备注
Rn 缓存器R0-R7
direct 8bit内部数据存储器,包括
1.内部数据存储器(00-7F)的地址
2.特殊功能缓存器(80-FF)的地址,如P0,PSW,TMOD..等
@Ri 由缓存器R0或R1所寻址的内部RAM数据
#data 8bit常数
#data 16 16bit常数
addr 16 16bit的目的地址,可使跳跃指令跳跃64k
addr 11 11bit的目的地址,可使跳跃指令跳跃2k
rel 具正负号的8位地址偏移量,用于相对地址的跳跃
bit 1个bit:只所有可以位寻址的位。(如PSW.7为CY旗号)
A 累加器(累积器)
C或CY 进位旗号
AC 辅助进位旗号
Bb 指定位B0-B7
D 半字节(4Bit)助忆符号
F0 旗号0
I 中断
PC 程序计数器
P0 I/O port 0
P1 I/O port 1
P2 I/O port 2
P3 I/O port 3
PSW 程序状态字组(类似于旗号缓存器)
SP 堆栈指针缓存器
B 缓存器B
DPTR 数据指针缓存器
X 外部滋要内存的助忆符号
@ 间接地址符号
$ 程序计数迄目前的值
reg 缓存器
8051 INSTRUCTION SET
1.Arithmetic operations:
Mnemonic Byte Cyc
ADD A,@Ri 1 1
ADD A,Rn 1 1
ADD A,direct 2 1
ADD A,#data 2 1
ADDC A,@Ri 1 1
ADDC A,Rn 1 1
ADDC A,direct 2 1
ADDC A,#data 2 1
SUBB A,@Ri 1 1
SUBB A,Rn 1 1
SUBB A,direct 2 1
SUBB A,#data 2 1
INC A 1 1
INC @Ri 1 1
INC Rn 1 1
INC DPTR 1 1
INC direct 2 1
INC direct 2 1
DEC A 1 1
DEC @Ri 1 1
DEC Rn 1 1
DEC direct 2 1
MUL AB 1 4
DIV AB 1 4
DA A 1 1
2.Logical opreations:
ANL A,@Ri 1 1
XRL A,@Ri 1 1
ANL A,Rn 1 1
XRL A,Rn 1 1
ANL A,direct 2 1
XRL A,direct 2 1
ANL A,#data 2 1
XRL A,#data 2 1
ANL direct,A 2 1
XRL direct,A 2 1
ANL direct,#data 3 2
XRL direct,#data 3 2
ORL A,@Ri 1 1
CLR A 1 1
ORL A,Rn 1 1
CPL A 1 1
ORL A,direct 2 1
RL A 1 1
ORL A,#data 2 1
RLC A 1 1
ORL direct,A 2 1
RR A 1 1
ORL direct,#data 3 2
RRC A 1 1
SWAP A 1 1
3.Data transfer:
Mnemonic Byte Cyc
MOV A,@Ri 1 1
MOV DPTR,#data16 3 2
MOV A,Rn 1 1
MOVC A,@A+DPTR 1 2
MOV A,direct 2 1
MOVC A,@A+PC 1 2
MOV A,#data 2 1
MOVX A,@Ri 1 2
MOV @Ri,A 1 1
MOVX A,@DPTR 1 2
MOV @Ri,direct 2 2
MOVX @Ri,A 1 2
MOV @Ri,#data 2 1
MOVX @DPTR,A 1 2
MOV Rn,A 1 1
PUSH direct 2 2
MOV Rn,direct 2 2
POP direct 2 2
MOV Rn,#data 2 1
XCH A,@Ri 1 1
MOV direct,A 2 1
XCH A,Rn 1 1
MOV direct,@Ri 2 2
XCH A,direct 2 1
MOV direct,Rn 2 2
XCHD A,@Ri 1 1
MOV direct,direct3 2
MOV direct,#data 3 2
4.Boolean variable manipulation:
Mnemonic Byte Cyc
CLR C 1 1
ANL C,bit 2 2
SETB C 1 1
ANL C,/bit 2 2
CPL C 1 1
ORL C,bit 2 2
CLR bit 2 1
ORL C,/bit 2 2
SETB bit 2 1
MOV C,bit 2 1
CPL bit 2 1
MOV bit,C 2 2
5.Program and machine control:
Mnemonic Byte Cyc
NOP 1 1
JZ rel 2 2
RET 1 2
JNZ rel 2 2
RETI 1 2
JC rel 2 2
ACALL addr11 2 2
JNC rel 2 2
AJMP addr11 2 2
JB bit,rel 3 2
LCALL addr16 3 2
JNB bit,rel 3 2
LJMP addr16 3 2
JBC bit,rel 3 2
SJMP rel 2 2
CJNE A,direct,rel 3 2
JMP @A+DPTR 1 2
CJNE A,#data,rel 3 2
DJNZ Rn,rel 2 2
CJNE @Ri,#data,rel 3 2
DJNZ direct,rel 3 2
CJNE Rn,#data,rel 3 2
反汇编看到fld[ecx]谁能告诉我 fld是什么命令?
浮点数运算指令:
fild:m16i/m32i/m64i;取存储器的整数,压入栈顶ST(0)。
FLD:M32R/M64R/M80R/ST(I);取存储器或ST(I)中的浮点数,压入栈顶。
FADD:M32R/M64R;ST(0)--ST(0)+32R/M64R。
FADD:ST,ST(I);ST(0)--ST(0)+ST(0)。
FADD:ST(I),ST(0);ST(I)--ST(I)+ST(0)。
FADD:ST(1)--ST(1)+ST(0),并出栈。
FMUL:M32R/M64R;ST(0)--ST(0)*M32R/M64R。
FMUL:ST,ST(I);ST(0)--ST(0)*ST(I)。
FMUL:ST(I),ST--(0);ST(I)*ST(0)。
FMUL;ST(1)--ST(1)*ST(0),并出栈。
反汇编代码解释
MOV R7,#TCON(0x88) //分别给寄存器R7和R6赋值,结合程序整体分析,R7和R6共通构成了 //了一个整形变量,例如:uint i=0x1388; MOV R6,#0x13TAG1://什么软件的反汇编,居然能编译出TAG来, /*这两句是将R7,和R6的值暂时存起来*/ MOV A,R7 MOV R4,0x06//以为51单片机中没有MOV R4,R6这条指令,所以用这条代替 //典型的双字节变量减1程序 DEC R7 //低八位先减1 JNZ TAG2//减1之前,如果不是0则跳到TAG2,是0则继续执行 DEC R6//高八位再减1TAG2: ORL A,R4//减一之前的高八位和低八位进行或运算 JNZ TAG1//如果是0则结束,如果不是0,则返回TAG1继续 //这在C里就是 while(i--);
跪求汇编语语言命令详解
哈哈,太多了
汇编命令详解
名称 解释 格式
a (Assemble) 逐行汇编 a [address]
c (Compare) 比较两内存块 c range address
d (Dump) 内存16进制显示 d [address]或 d [range]
e (Enter) 修改内存字节 e address
f (fin) 预置一段内存 f range list
g (Go) 执行程序 g [=address][address...]
h (Hexavithmetic) 制算术运算 h value value
i (Input) 从指定端口地址输入 i pataddress
l (Load) 读盘 l [address [driver seetor>
m (Move) 内存块传送 m range address
n (Name) 置文件名 n filespec [filespec...]
o (Output) 从指定端口地址输出 o portadress byte
q (Quit) 结束 q
r (Register) 显示和修改寄存器 r [register name]
s (Search) 查找字节串 s range list
t (Trace) 跟踪执行 t [=address] [value]
u (Unassemble) 反汇编 u [address ]或range
w (Write) 存盘 w [address[driver sector secnum>
? 联机帮助 ?
debug小汇编a命令
debug小汇编a命令是一个很有用的功能,许多的小程序都要他来做。
编一些小程序比汇编要来得方便,快洁。
在Debug中,中断是非常有用的,首先,让我们先了解一下中断。
所谓中断,其实,就是,当你做某事时,有人过来找你有其他事,你先放下手中的事(计算机中,称为保护现场)
,再去与叫你的那个人办事去,等完了,你又回,接着做刚才的事。这是个很通俗的讲法。
计算机在运行时,也会出现这种情况,我们叫之中断。
下面是他的一些常用中断向量的入口值详解:(记住哦,很用的...呵呵)
IBM PC 中断 int10
ooH 屏幕方式设置
入口:AH=0,AL=显示方式代码(0--6)
0:40*25 黑白
1:40*25 彩色
2:80*25 黑白
3:80*25 彩色文本
4:320*200 彩色
5:320*200 黑白
6:640*200 黑白图形模式
7:80*25 单色字符(单色显示器)
0BH 色彩设置
入口:AH=0B,BL=0 设背景色,BH=0--15 BL=1 设调色码,BH=0--1
0CH 写图形点
入口:AH=0C,CX:DX=列号:行号,AL=颜色
ODH 读图形点
入口:AH=0D,CX:DX=列号:行号
返回:AL=颜色
0EH 在当前页、当前光标处写字符
入口:AH=0E,AL=字符的ASCII码,BL=前景色
OFH 显示器状态
入口:AH=0F
返回:AL=当前显示器方式,AH=屏幕列数,BH=当前页号
01H 光标设置
入口:AH=1,CH=光标起始行号(00--0C),CL=光标结束行号(00--0C)
注:CH > CL
02H 光标定位
入口:AH=2,BH=页号,DH:DL=起始行:列
03H 读光标位置
入口:AH=3,BH=页号。
返回:DH:DL=起始行:列
06H 窗口上卷
入品:AH=6,AL=窗口上卷行数,CH:CL-DH:DL 窗口坐标
注:AL=0 卷动整个窗口
07H 窗口下卷
入口:AH=7,AL=窗口下卷行数,CH:CL-DH:DL 窗口坐标
08H 读当前光标处字符和属性
入口:AH=8,BH=页号。
返回:AH:AL=字符的颜色:字符的ASCII码
注:颜色代码见下对照表
09H:在当前光标处写字符和属性
注:光标不下移
入口:AH=9,BH=页号,BL:AL=字符的颜色:字符的ASCII码,CX=重复次数
1 2 3 4 5 6 7 8
BL R G B I R G B
闪烁 字符底色 加亮 字符颜色
中断向量号表
中断号 解释 中断号 解释
0 除数为0错 19 引导装入程序
1 音步中断 1A 日时调用
2 不可屏蔽中断NMI 1B 键盘阻断时得到控制权
3 断电中断(CCH) 1C 时钟中断时得到控制权
4 溢出中断 1D 指向CRT初始参数表
5 屏幕打印中断 1E 指向盒带参数表
6-7 保留 1F 1KB图形模式
8 计时器中断(18.2秒) 20 结束DOS程序
9 键盘中断 21 DOS功能调用
A-D 保留 22 结束地址(建义用EXEC)
E 软盘机中断 23 DOS Crtl-Break退出地址
F 保留 24 DOS致命错向量
10 屏幕I/O调用 25 DOS绝对磁盘读
11 设备检查调用 26 DOS绝对磁盘写
12 存储器检查调用 27 结束程序并驻留(建义用31h)
13 软盘机I/O调用 28-3F DOS保留
14 RS-233I/O调用 40-7F 未用
15 盒带机I/O调用 80-85 BASIC保留
16 键盘I/O调用 86-F0 BASIC解释程序用
17 打印机I/O调用 F1-FF 未用
18 ROM-BASIC入口
指令名详解
call 指令(过程调用)(控制指令-长转移)
详解:
段内直接调用
段内间接调用(寄存器)
段内间接调用(存储器)
段间直接调用
段间间接调用
指令名
jmp 指令(无条件转移指令)(控制指令-长转移)
详解:
段内直接跳转
短段内直接跳转
段内间接跳转(寄存器)
段内间接跳转(存储器)
段间直接跳转
段间间接跳转
指令名
ret 指令(过程返回)(控制指令-长转移)
详解:
段内返回
段内返回立即数加于sp
段间返回
段间返回立即数加于sp
na/jnbe 指令(控制指令-短转移) 不小于或不等于时转移
jae/jnb 指令 (控制指令-短转移) 大于或等于时转移
jb/jnae 指令 (控制指令-短转移) 小于转移
jbe/jna 指令 (控制指令-短转移) 小于或等 于转移
jg/jnle 指令(控制指令-短转移) 大于转移
jge/jnl 指令 (控制指令-短转移) 大于或等于转移
jl/jnge 指令 (控制指令-短转移) 小于转移
jle/jng 指令 (控制指令-短转移) 小于或等 于转移
je/jz 指令 (控制指令-短转移) 等于转移
jne/jnz 指令 (控制指令-短转移) 不等于转移
jc 指令 (控制指令-短转移) 有进位时转移
jnc 指令 (控制指令-短转移) 列进位时转移
jno 指令 (控制指令-短转移) 不溢出时转移
jnp/jpo 指令 (控制指令-短转移) 奇偶性为奇数时转移
jns 指令 (控制指令-短转移) 符号位为"0"转移
jo 指令 (控制指令-短转移) 溢出转移
jp/jpe 指令 (控制指令-短转移) 奇偶性为偶数时转移
js 指令 (控制指令-短转移) 符号位为"1"时转移
loop 指令 (循环控制指令-短转移) cx 不为0时循环
loope/loopz 指令 (循环控制指令-短转移) cx 不为0且标志 z=1 时循环
loopne/loopnz 指令 (循环控制指令-短转移) cx 不为0且标志 z=0 时循环
jcxz 指令 (循环控制指令-短转移) cx 为0时转移
int 指令 (中断指令) 中断指令(后详解)
into 指令 (中断指令) 溢出中断
iret 指令 (中断指令) 中断返回
指令名
shl 指令(逻辑左移)
sal 指令(算术左移)
shr 指令(逻辑右移)
sar 指令(算术右移) 寄存器,1
rol 指令(循环左移) 寄存器,cl
ror 指令(循环右移) 存储器,1
rcl 指令(通过进位的循环左移)存储器,cl
rcr 指令(通过进位的循环右移)(逻辑运算)
not 指令(取反运算)寄存器求反
(逻辑运算)存储器求反
and 指令(与运算) (逻辑运算)
寄存器 and 寄存器 寄存器
寄存器 and 存储器 寄存器
存储器 and 寄存器 存储器
立即数 and 存储器 存储器
立即数 and 累加器 累加器
or 指令(或运算)(逻辑运算)
寄存器 or 寄存器 寄存器
寄存器 or 存储器 寄存器
存储器 or 寄存器 存储器
立即数 or 存储器 存储器
立即数 or 累加器 累加器
test 指令(测试) (逻辑运算)
寄存器 test 寄存器
寄存器 test 存储器
寄存器 test 立即数
存储器 test 立即数
累加器 test 立即数
movs 指令(串传送)(字符串操作指令)
单个传送
重复传送
cmps 指令(串比较) (字符串操作指令)
单个比较
重复比较
scas 指令(串扫描)(字符串操作指令)
单个搜索
重复搜索
lods 指令(装入串)
(字符串操作指令)
单个装载
重复装载
stos 指令(保存串) (字符串操作指令)
单个存储
重复存储
mov 指令(传送字或字节)(数据传送命令)
寄存器与寄存器间传送
存储器与寄存器间传送
立即数传送给存储器
立即数传送给寄存器
存储器传送给累加器
累加器传送存储器
寄存器传送给段寄存器
存储器传送给段寄存器
段寄存器传送给寄存器
段寄存器传送给存储存器
pop 指令(把字弹出堆栈) (数据传送命令)
push 指令(把字压入堆栈)
存储器
寄存器
段寄器
xchg 指令(交换字或字节) (数据传送命令)
寄存器与寄存器交换
存储器与寄存器交换
寄存器与累加器交换
in 指令(端口输入) (数据传送命令)
直接输入
间接输入
out 指令(端口输出) (数据传送指令)
直接输出
间接输出
add 指令(加法)(算术指令)
adc 指令(带进位加法)
寄存器+寄存器 寄存器
寄存器+存储器 寄存器
存储器+寄存器 存储器
立即数+存储器 存储器
立即数+累加器 累加器
inc 指令(加1)(算术指令)
存储器增量
寄存器增量
sub 指令(减法) (算术指令)
sbb 指令(带借位减法)
寄存器-寄存器 寄存器
寄存器-存储器 寄存器
存储器-寄存器 存储器
立即数-存储器 存储器
立即数-累加器 累加器
dec 指令(减1)(算术指令)
存储器减量
寄存器减量
nec 指令(求反,以0减之)
寄存器求补
存储器求补
cmp 指令(比较)(算术指令)
寄存器与寄存器比较
寄存器与存储器比较
寄存器与立即数比较
存储器与立即数比较
累加器与立即数比较
mul 指令(无符号乘法) (算术指令)
imul 指令(整数乘法)
与8位寄存器相乘
与16位寄存器相乘
与8位存储单元相乘
与16位存储单元相乘
div 指令(无符号除法)(算术指令)
idiv 指令(整数除法)
被8位寄存器除
被16位寄存器除
被8位存储单元除
被16位存储单元除
Debug实战
1.查看主板的生产日期,版本
D ffff:05
D fe00:0e
2.模拟Rest键功能
A
:100 jmp ffff:0000
:105
g
3.快速格式化软盘
L 100 0 0 * '插入一张己格式化软盘
W 100 0 0 * '放入一张欲格式化软盘
注:* 分别为:720K e |1.2M id |1.44M 21
4.硬盘格式化两种方法
(1)G=c800:05
(2) A 100
mov ax,0703
mov cx,0001
mov dx,0080
int 13
int 3
g 100
5.加速键盘
A
mov ax,0305
mov bx,0000
int 16
int 20
rcx
10
n fast.com
w
q
6.关闭显示器(恢复时,按任意键)
A
mov ax,1201
mov bl,36
int 10
mov ah,0
int 16
mov ax,1200
int 10
rcx
10
n crt-of.com
w
q
7.硬盘DOS引导记录的修复
在软驱中放入一张己格式化软盘
debug
-l 100 2 0 1
-w 100 0 50 1
把软盘放入故障机软驱中
debug
-l 100 0 50 1
-w 100 2 0 1
-q
8.清coms中setup口令
debug
-a
mov bx,0038
mov cx,0000
mov ax,bx
out 70,al
inc cx
cmp cx,0006
jnz 0106
int 20
-rcx
:20
-nclearpassword.com
-w
-q
注:以上适合super与dtk机,对于ast机,因为他的口令放在coms的4ch-51h地址处,只要将:mov bx,0038 改为: mov
bx,004c即可
9.取消coms的密码(将coms数据清为初始化)
-o 70,10
-o 71,10
-g
-q
10.将硬盘主引导记录保存到文件中
debug
-a
mov ax,0201
mov bx,0200
mov cx,0001
mov dx,0080
mov int 13
int 3
-rcx
:200
-nboot.dat
-w
-q
11.调用中断实现重启计算机(可以成文件)
debug
-a
int 19
int 20
-rcx
:2
-nreset.com
-w
-q
DEBUG主要命令
DEBUG是为汇编语言设计的一种高度工具,它通过单步、设置断点等方式为汇编语言程序员提供了非常有效的调试手段。
一、DEBUG程序的调用
在DOS的提示符下,可键入命令:
C:\DEBUG [D:][PATH][FILENAME[.EXT>[PARM1][PARM2]
其中,文件名是被调试文件的名字。如用户键入文件,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的D指定驱动器PATH为路径,PARM1和PARM2则为运行被调试文件时所需要的命令参数。
在DEBUG程序调入后,将出现提示符,此时就可用DEBUG命令来调试程序。
二、DEBUG的主要命令
1、显示存储单元的命令D(DUMP),格式为:
_D[address]或_D[range]
例如,按指定范围显示存储单元内容的方法为:
-d100 120
18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...
18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.
7
18E4:0120 8B
其中0100至0120是DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。
2、修改存储单元内容的命令有两种。
·输入命令E(ENTER),有两种格式如下:第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:
-E address
例如,-E DS:100 F3'XYZ'8D
其中F3,'X','Y','Z'和各占一个字节,该命令可以用这五个字节来替代存储单元DS:0100到0104的原先的内容
第二种格式则是采用逐个单元相继修改的方法。命令格式为:
-E address
例如,-E DS:100
则可能显示为:
18E4:0100 89.-
如果需要把该单元的内容修改为78,则用户可以直接键入78,再按"空格"键可接着显示下一个单元的内容,如下:
18E4:0100 89.78 1B.-
这样,用户可以不断修改相继单元的内容,直到用ENTER键结束该命令为止。
·填写命令F(FILL),其格式为:
-F range list
例如:-F 4BA:0100 5 F3'XYZ'8D
使04BA:0100~0104单元包含指定的五个字节的内容。如果list中的字节数超过指定的范围,则忽略超过的项;如果list的字节数小于指定的范围,则重复使用list填入,直到填满指定的所有单元为止。
3)检查和修改寄存器内容的命令R(register),它有三种格式如下:
·显示CPU内所有寄存器内容和标志位状态,其格式为:
-R
例如,-r
AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NC
18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000
·显示和修改某个寄存器内容,其格式为:
-R register name
例如,键入
-R AX
系统将响应如下:
AX F1F4
:
即AX寄存器的当前内容为F1F4,如不修改则按ENTER键,否则,可键入欲修改的内容,如:
-R bx
BX 0369
:059F
则把BX寄存器的内容修改为059F。
·显示和修改标志位状态,命令格式为:
-RF系统将响应,如:
OV DN EI NG ZR AC PE CY-
此时,如不修改其内容可按ENTER键,否则,可键入欲修改的内容,如:
OV DN EI NG ZR AC PE CY-PONZDINV
即可,可见键入的顺序可以是任意的。
4)运行命令G,其格式为:
-G[=address1][address2[address3…>
其中,地址1指定了运行的起始地址,如不指定则从当前的CS:IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容,和下一条将要执行的指令。
5)跟踪命令T(Trace),有两种格式:
·逐条指令跟踪
-T [=address]
从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址则从当前的CS:IP开始执行。
·多条指令跟踪
-T [=address][value]
从指定地址起执行n条指令后停下来,n由value指定。
6)汇编命令A(Assemble),其格式为:
-A[address]
该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。必须注意:DEBUG把键入的数字均看成十六进制数,所以如要键入十进制数,则其后应加以说明,如100D。
7)反汇编命令U(Unassemble)有两种格式。
·从指定地址开始,反汇编32个字节,其格式为:
-U[address]
例如:
-u100
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70606020202 MOV WORD PTR[0208],0202
18E4:0112 BBO4O2 MOV BX,0204
18E4:0115 E80200 CALL 011A
18E4:0118 CD20 INT 20
18E4:011A 50 PUSH AX
18E4:011B 51 PUSH CX
18E4:011C 56 PUSH SI
18E4:011D 57 PUSH DI
18E4:011E 8B37 MOV SI,[BX]
如果地址被省略,则从上一个U命令的最后一条指令的下一个单元开始显示32个字节。
·对指定范围内的存储单元进行反汇编,格式为:
-U[range]
例如:
-u100 10c
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70606020202 MOV WORD PTR[0208],0202
或
-u100 112
18E4:0100 C70604023801 MOV WORD PTR[0204],0138
18E4:0106 C70606020002 MOV WORD PTR[0206],0200
18E4:010C C70606020202 MOV WORD PTR[0208],0202
可见这两种格式是等效的。
8)命名命令N(Name),其格式为:
-N filespecs [filespecs]
命令把两个文件标识符格式化在CS:5CH和CS:6CH的两个文件控制块中,以便在其后用L或W命令把文件装入存盘。filespecs的格式可以是:
[d:][path] filename[.ext]
例如,
-N myprog
-L
-
可把文件myprog装入存储器。
9)装入命令(Load),有两种功能。
·把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:
-L[address[drive sector sector]
·装入指定文件,其格式为:
-L[address]
此命令装入已在CS:5CH中格式化了文件控制块所指定的文件。如未指定地址,则装入CS:0100开始的存储区中。
10)写命令W(Write),有两种功能。
·把数据写入磁盘的指定扇区。其格式为:
-W address drive sector sector
·把数据写入指定的文件中。其格式为:
-W[address]
此命令把指定的存储区中的数据写入由CS:5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS:0100开始。要写入文件的字节数应先放入BX和CX中。
11)退出DEBUG命令Q(Quit),其格式为:
-Q
它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。
问题:初学者问一个低级问题,执行debug-a后,如果有一行输入错误,如何更改这一行?
回答:
加入进行如下输入:
D:\PWIN95\Desktop>debug
-a
2129:0100movax,200
2129:0103movbx,200
2129:0106movcx,200
2129:0109
此时,发现movbx,200一句错误,应为movbx,20,可以敲回车返回"-"状态,然后输入:
-a103
2129:0103movbx,20
如果多或者少若干行,不必重新输入,可以用M命令移动后面的程序来去掉或者增加程序空间.
A.程序调用命令
C>DEBUG [D:] [PATH] [FILENAME[.EXT]] [PARM1] [PARM2]
其中,文件名是被调试文件的名字。如未键入文件名。可用DEBUG命令N和L把需要文件装入存储器后再调试。D指定驱动器,PATH为路径,FILENAME为文件名,PARM为命令参数
B.显示存储单元命令
-D [ADDRESS]或 ;ADDRESS 地址
-D [RANGE] ;RANGE 范围
C.修改存储单元内容命令
-E ADDRESS [LIST]
D.检查和修改寄存器内容命令
-R [REGISTER NAME] ;Register name 寄存器名字
E.汇编命令
-A [ADDRESS]
F.跟踪命令
-T [=ADDRESS] [VALUE] ;Value 变量值
G.运行命令
-G [=ADDRESS ] [ADDRESS2 [ADDRESS3]
H.反汇编命令
-U [ADDRESS]
-U [RANGE]
I.命名命令
-N FILESPECS [FILESPECS]
FILESPECS的格式可为[D:][PATH]FILENAME [.EXT]
J.装入命令
-L [ADDRESS[DRIVE SECTOR SECTOR]] ;DRIVE SECTOR 磁盘 扇区
K.写命令
W ADDRESS DRIVE SECTOR
L.退出命令
-Q
一段C语言 反汇编代码,要求详解每句含义
80481d6: 83 e4 f0 and $0xfffffff0,%esp
这一句是进行4字节对齐的,上一句sub esp... 是分配局部变量空间,其大小可能不是整4字节的,那样就会导致后面分配的变量以非4字节对齐的地址存放,导致性能降低,有这一句就好了。你可以当它是空气,不用管。
cmp $0xfffff000,%eax
这个是比较EAX的值是不是0xFFFFF000并置相应标志
汇编语言很复杂,现在很少人学
看后晕了
and $0xfffffff0,%esp 将esp和16进制的fffffff0进行与运算,
cmp $0xfffff000,%eax 将fffff000减去eax,但只改变标志位,而不影响两个数的大小,一般CMP指令后面会跟一个跳转指令,也可以说CMP指令是比较指令
neg %ebx 求EBX相反数的补码
nop指令的机器码是90,也就是空指令,不起作用的,sub $0x8,%esp这条指令是用于平衡堆栈的,如楼上所说,你可以当它是空气..有些汇编代码不用刻意去看懂,扫一眼知道是干什么用的就行了,有的就得仔细推敲它的含意和它起的作用
vs反汇编函数入口处指令
这个很简单ebp-0c0h 是给出一段深度为0c0h堆栈,留给你的函数存变量。
因为第一条指令前还有一条指令mov ebp esp 所以从ebp到esp是一个深度为0c0h的堆栈,可以想想下 esp想当于地面
现在你朝地下挖了个深度为0c0h的洞,ebp现在就是洞底。
然后,rep stos 是重复指令,重复次数是 30h 次,表示每次都向那个洞里放0cccccccch,
0ccccccch是4个字节,放30次 ,刚好等于第一句指定的堆栈的深度(16进制 30h*4=0c0h,有不理解打开windows
计算器算下)
所以余下三句的意思就是 你把那个洞里全放成了0cccc cccch
为什么要放0ccccccch?
0cccccccch是个机器指令,是个中断指令。因为堆栈是存变量的,不可能被执行,所以一旦万一发生错误使堆栈被执行,那也只能执行个中断
被断了下来。
《天书夜读 从汇编到windows内核编程》第一章有详细说明 ,有什么不理解你再去参考下吧
在线求答案反汇编AND指令
意思是只保留bit[2]
汗,大家在讨论什麽。。。
搂主,这个 操作好像单句不能被替换,至少我不知道
问下,你下一句应该是个跳转吧??如果是你可以用移位的方式,把bit[2]移到对应的标志寄存器比如
SHR AL, 3
这样你的CF寄存器中就是bit[2]的值了,然后检查它就好了
换种方式思考吧~~
你是什么意思?是将命令转化为机器码吗?and的机器码为24h,这条命令就是2404。
你用的是什么反汇编软件?
我也不是很懂的~呵
AND:
比如说2 and 3
2的二进制就是10,三是11
10
11
--
10
就是说位比位,如果都是1的话,结果位也是1,如果都是0,结果位也是0,如果一个1一个0,结果0
再比如
101111000001(3009)
010110001110(1422)
==================
000110000000(384)
CALC一下,看看是不是,呵呵
AND AL,4
就是AL寄存器里的值和4AND
比如AL=85H
和4AND就是
85H AND 4H(H为16进制的意思)
如何快速读懂反汇编的汇编代码?
简单的逆向工程其实不难,IDA加Hex-Rays插件,可以直接把汇编还原成C代码。虽然还原出来的代码比较怪,但是已经比直接看汇编代码强多了。
如果想学逆向工程,常用的汇编指令要熟悉,各种调用约定要搞清楚,比如stdcallastcallcdecl、thiscall等,还有ARM的APCS,这对你理解函数之间的调用、参数的传递、栈指针的变化等很关键。如果程序在编译的时候没有使用全局优化,难度会低一些,使用全局优化后,各种寄存器会跨函数直接使用,跟踪起来比较费劲。
1.首先建议学习几门语言:汇编、C++、,Python,C++里的编程范型是比较多的。.这三门语言,差不多可以代表现今发挥了巨大作用的编程语言了。2.逆向的直接基础知识,推荐几本书:Intel 微处理器.Windows环境下32位汇编语言程序设计C++反汇编与逆向分析技术揭秘IDA Pro权威指南这些书是基本的书籍,要么很基础(汇编),要么比较抽象的研究软件逆向.没有多少实际的逆向的例子.比如UltraISO注册算法&keygen分析很典型.你看了就知道软件逆向到底涉及了多少知识.3.再掌握几个工具:
静态反汇编工具: IDA Pro动态反汇编工具: ollydbg/x64dbgWindows内核调试工具: windbg
求解释段汇编指令.
首先你这段程序应该是反汇编出来的代码,大概意思就是移动字符串
就是说将一段保存的字符串,转存到另一个地址中
下面具体分析下:
lea esi, dword ptr [ecx+esi-4] ;将ECX+ESI-4结果给ESI
lea edi, dword ptr [ecx+edi-4] ;将ECX+EDI-4结果给EDI
sar ecx, 2 ;将ECX右移两位相当于除以4
js short 00402925 ;判断最高位是否为1,为1则跳到 00402925(移位时,最高位不变)
std ;置方向标志1,DF=1,地址从高到低传送(针对下条指令)
rep movs dword ptr es:[edi], dword ptr [esi] ;循环移动ESI指向的串到EDI指向地址ECX次
mov ecx, eax
and ecx, 3
add esi, 3
add edi, 3
rep movs byte ptr es:[edi], byte ptr [esi];同上and ecx,3是因为之前传送是以双字(4Byte)为单位,余下的几个字节继续传送完毕
cld ;置方向标志0,DF=0,
例如某ESI地址存储字串123456789共9个字节即ECX=9
赋值ESI=ESI+ECX-5此时ESI指向6
同样EDI指向另一个地址处
因为是双字传送所以ECX除4为2即传送2次双字
第一次传6789后ECX减1,ESI-4,EDI-4,ESI指向2345传送后
ECX减1(为0),ESI-4,EDI-4;ESI指向xxx1第一个X处
此时ECX=0结束rep movs
而后(程序在最初eax赋值为ECX)同3做与操作为1
ESI,EDI+3指向1处传送ECX一次结束rep movs传送串操作
are you ok?
首先你这段程序应该是反汇编出来的代码,大概意思就是移动字符串
就是说将一段保存的字符串,转存到另一个地址中
下面具体分析下:
lea esi, dword ptr [ecx+esi-4] ;将ECX+ESI-4结果给ESI
lea edi, dword ptr [ecx+edi-4] ;将ECX+EDI-4结果给EDI
sar ecx, 2 ;将ECX右移两位相当于除以4
js short 00402925 ;判断最高位是否为1,为1则跳到 00402925(移位时,最高位不变)
std ;置方向标志1,DF=1,地址从高到低传送(针对下条指令)
rep movs dword ptr es:[edi], dword ptr [esi] ;循环移动ESI指向的串到EDI指向地址ECX次
mov ecx, eax
and ecx, 3
add esi, 3
add edi, 3
rep movs byte ptr es:[edi], byte ptr [esi];同上and ecx,3是因为之前传送是以双字(4Byte)为单位,余下的几个字节继续传送完毕
cld ;置方向标志0,DF=0,
例如某ESI地址存储字串123456789共9个字节即ECX=9
赋值ESI=ESI+ECX-5此时ESI指向6
同样EDI指向另一个地址处
因为是双字传送所以ECX除4为2即传送2次双字
第一次传6789后ECX减1,ESI-4,EDI-4,ESI指向2345传送后
ECX减1(为0),ESI-4,EDI-4;ESI指向xxx1第一个X处
此时ECX=0结束rep movs
而后(程序在最初eax赋值为ECX)同3做与操作为1
ESI,EDI+3指向1处传送ECX一次结束rep movs传送串操作
are you ok?