汇编第五日

Posted chaunceyctx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编第五日相关的知识,希望对你有一定的参考价值。

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!!!

以上是关于汇编第五日的主要内容,如果未能解决你的问题,请参考以下文章

反汇编问题

16位汇编第六讲汇编指令详解第第三讲

汇编04:第一个汇编程序

32位汇编第七讲,混合编程,内联汇编

16位汇编第六讲汇编指令详解第二讲

[汇编]《汇编语言》第18章 附注内容(完结)