码迷,mamicode.com
首页 > 其他好文 > 详细

汇编第五日

时间:2017-08-05 23:41:02      阅读:378      评论:0      收藏:0      [点我收藏+]

标签:语言   机器码   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!