标签:语言 机器码 fse 需要 images span 问题: 汇编 blog
mov ax, offset 标号:取得标号相对于伪代码后第一条指令地址0的相对偏移量即标号地址
可以发现汇编指令中的idata会直接反映在机器码中
jmp指令可以修改IP或CS和IP的值,具体格式如下:
①jmp short 标号(段内转移)
(IP) = (IP)+ 8位位移
8位位移含义是:标号地址减去jmp指令的下一条指令地址即为相对位移地址(可正可负,但是范围必须在8位数据能表示之内)并不是直接目的地址
8位位移范围为-128 - 127
例如:
JMP 0008即跳到0BBD:0008位置,但是机器码中却没有反映0008,那是因为将JMP指令放入指令缓冲区中后,IP会自增JMP指令的大小2字节,此时IP为0005,0005跳到0008还需要0003(相对位移),所以机器码中反映了03
②jmp near ptr 标号(2^16 = 64KB 刚好为一个段最大值所以用于段内转移)
(IP) = (IP) + 16位位移
16位位移范围:-2^15 - (2^15)-1
③jmp far ptr 标号(2 ^ 32 > 64KB,段间转移)
(IP) = (IP) + 32位位移
机器码中却反映了目的地址,不为相对位移地址
④jmp reg(段内转移)
reg为16位:(IP) = (reg)
⑤jmp word ptr 内存单元(段内转移)
(IP) = (内存单元)
⑥jmp dword ptr 内存单元(段间转移)
(IP) = (低双字)
(CS) = (高双字)
jcxz 标号:
有条件转移,与cx寄存器内容有关
cx = 0 跳转到标号位置执行
cx!=0 不跳转
(IP) = (IP) + 8位位移
loop指令执行过程
1.cx--
2.cx = 0跳转到标号,反之
(IP) = (IP) + 8位位移
总结:除了jmp far ptr,其余改变IP的都是给出相对位移地址
nop指令:空指令 占1字节
ret指令:
用栈顶数据修改IP值
执行过程:
(IP) = ((SS) * 16 + (SP))
(SP) = (SP) + 2 ;两步相当于pop ip
retf指令:
用栈顶数据修改IP和CS
执行过程:
(IP) = ((SS) * 16 + (SP))
(SP) = (SP) + 2 ;两步相当于pop ip
(CS) = ((SS) * 16 + (SP))
(SP) = (SP) + 2 ;两步相当于pop cs
call指令:
①将IP或CS和IP压栈即(SP) = (SP) -2; ((SS) * 16 + (SP)) = (IP)
②jmp near ptr 标号(机器码中表现的是相对位移地址),即(IP) = (IP) + 16位位移
call far ptr 标号:
(SP) = (SP) - 2
((SS) * 16 + (SP)) = (CS);两步相当于push cs
(SP) = (SP) - 2
((SS) * 16 + (SP)) = (IP);两步相当于push ip
(CS) = 标号对应的段地址
(IP) = 标号对应的偏移地址;两步相当于jmp far ptr 标号
call reg(段内转移):
①push IP
②jmp reg 即(IP) = (reg)
call word ptr 内存单元:
①push IP
②jmp word ptr 内存单元
call dword ptr 内存单元:
①push cs(低16位)
②push ip(高16位)
③jmp dword ptr 内存单元
call和ret配合使用相当于调用一个子程序(相当于高级语言中的调用函数)
mul 16位reg或内存单元:
相乘两个数要么都是8位,要么16位
①mov byte ptr ds:[0]
byte指明数据为8位:
(ax) = (al) * ((ds)*16+0)
②mov word ptr ds:[0]
word指明数据为16位:
(ax) = (ax) * ((ds)*16+0)低16位
(ax) = (ax) * ((ds)*16+0)高16位
对于调用子程序传参问题:
①参数少可以用寄存器解决
②参数多的话,将参数放入内存空间中,再将其首地址传过去
通用寄存器都可以化成h和l
Done!!!
标签:语言 机器码 fse 需要 images span 问题: 汇编 blog
原文地址:http://www.cnblogs.com/chaunceyctx/p/7287748.html