|
发表于 2013-2-5 16:48:23
|
显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-2-5 19:30 编辑
想精确计算就看INTEL手册吧
这里只是笨方法
一般指令比较好计算,比较偏的指令我们一般不计算
就拿一般讲(只讲16位,32位差不多)
不同硬件架构指令字节数是不同的,这里拿X86来讲
首先乱写(没有实际意义,做实验而已)一段代码做测试
下面这段废话看几个特例就可以了
- assume cs:code
- code segment
- start: inc ax
- mov ax,1
- mov ax,0FFFFh
- mov ax,bx
- ;push 1 不知道为什么16位好像不允许PUSH立即数
- push bx
- nop
- jmp s0
- nop
- nop
- s0: jmp s1
- nop
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- mov ax,1
- s1: mov ax,1
- mov ax,4c00h
- int 21h
- code ends
- end start
复制代码
我们在DEBUG用-u看指令(用DEBUG只是进行推导或猜测以便我们以后不用DEBUG都能知道字节数)
首先INC ax
inc指令都是占1个字节
mov ax,1 3个字节
注意:mov 这个指令占一个字节
这里用立即数来赋值,立即数占字节较多 占2个字节(固定的,通过mov ax,0ffffh可以验证)
所以占3个字节
注意同mov ax,bx这种两个都是寄存器的进行比较
mov ax,bx 2个字节
对于这种mov操作 两个操作数都是寄存器的直接确定2个字节
push bx(push 固定一个字节)
jmp s0 两个字节
这个JMP占一个字节,后面看位移多大,一个字节装不下位移就两个字节,类推
jmp s0 跳的比较近
后面的位移1个字节就搞定了
后面jmp s1 3个字节
跳的比较远
jmp占1个字节
位移一个字节装不下,所以用两个字节装下了
都是猜测,不一定正确,其他指令用这种方法也可以猜出来规律吧
靠累积吧
也不常用
|
|