如何根据机器码来获得相应的汇编指令。主要是CALL指令不会
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据机器码来获得相应的汇编指令。主要是CALL指令不会相关的知识,希望对你有一定的参考价值。
例如:805cc406 e87507f7ff call 8053cb80
是怎么得来的?
75 07 f7 ff:代表32位整数 ff f7 07 75 补码表示
也就是说调用一个函数,这个函数的位置距离当前代码的位置是ff f7 07 75
这一句代码5个字节,执行之后eip变为 805cc406+5 = 805cc40b
然后加上这个位置, 805cc40b + fff70775 = 18053cb80,因为是32位整数所以开头的1溢出了,被砍掉,最后变为 8053cb80
于是这一句就是 call 8053cb80 了 参考技术B 这个看是什么单片机,应该说每种单片机的机器码都不一样的,每条指令对应一个机器码; 参考技术C 查对照表。。。。。。。。。。追问
给个表
汇编语言——call 和 ret 指令
一、ret 和 retf
我们用汇编语法来解释ret和retf指令,则:
CPU执行ret指令时,相当于进行:
- pop IP
CPU执行retf指令时,相当于进行:
- pop IP(一般IP都是在低位地址的)
- pop CS(CS在高位地址)
二、call指令
CPU执行call指令,进行两步操作:
(1)将当前的 IP 或 CS和IP 压入栈中;
(2)转移。
call 指令不能实现段内短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同,下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式。
段内转移
指令格式:call 标号
CPU执行上面指令相当于进行:
push IP
jmp near ptr 标号
段间转移
指令格式:call far ptr 标号
CPU 执行上面指令时,相当于进行:
push CS
push IP
jmp far ptr 标号
转移地址在寄存器中的call指令
指令样式:call 16位寄存器
CPU执行以上指令时,相当于进行:
push IP
jmp 16位寄存器
转移地址在内存中的call指令
(1) call word ptr 内存单元地址
汇编语法解释:
push IP
jmp word ptr 内存单元地址
(2) call dword ptr 内存单元地址
汇编语法解释:
push CS
push IP
jmp dword ptr 内存单元地址
mul指令
mul是乘法指令,使用 mul 做乘法的时候:
(1)相乘的两个数:要么都是8位,要么都是16位。
8 位: AL中和 8位寄存器或内存字节单元中;
16 位: AX中和 16 位寄存器或内存字单元中。
使用mul座乘法的时候:
(2)结果
8位:AX中;
16位:DX(高位)和AX(低位)中。
(3)指令样式
mul reg
mul 内存单元
(4)内存单元可以用不同的寻址方式给出
mul byte ptr ds:[0]
含义为: (ax)=(al)*((ds)*16+0);
mul word ptr [bx+si+8]
含义为:
(ax)=(ax)*((ds)*16+(bx)+(si)+8)结果的低16位;
(dx)=(ax)*((ds)*16+(bx)+(si)+8)结果的高16位;
示例:计算100*10000
100小于255,可10000大于255,所以必须做16位乘法,程序如下:
mov ax,100
mov bx,10000
mul bx
结果: (ax)=4240H,(dx)=000FH(F4240H=1000000)
方法一:
方法二:一直jmp,等到cx的值为0的时候使用jcxz跳出循环(好处,不用我们设置cx的大小了)
方法三:寄存器是有限的,so我们可以使用栈来存放数据
1 capital: push cx 2 push si 3 4 change: mov cl,[si] 5 mov ch,0 6 jcxz ok 7 and byte ptr [si],11011111b 8 inc si 9 jmp short change 10 11 ok: pop si 12 pop cx 13 ret
以上是关于如何根据机器码来获得相应的汇编指令。主要是CALL指令不会的主要内容,如果未能解决你的问题,请参考以下文章