美文网首页
关于汇编

关于汇编

作者: tadelemon | 来源:发表于2017-09-23 14:26 被阅读32次

    eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。

    EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
    EBX 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
    ECX 是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
    EDX 则总是被用来放整数除法产生的余数。
    ESP:寄存器存放当前线程的栈顶指针
    EBP:寄存器存放当前线程的栈底指针
    EIP:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
    ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
    EBP是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer).

    MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据传送本质上也是一样的)。其特点是不破坏源地址单元的内容。
    例如:
    MOV AX,2000H;将16位数据2000H传送到AX寄存器
    MOV AL,20H;将8位数据20H传送到AL寄存器
    MOV AX,BX;将BX寄存器的16位数据传送到AX寄存器
    MOV AL,[2000H];将2000H单元的内容传送到AL寄存器
    需要注意的是:
    (1)两个存储单元之间不能直接传送数据,即:MOV指令只允许一个操作数在存储器中。MOV [SI],[2000H];这是错误的
    (2)MOV指令中立即数不能直接传送给段寄存器(CS、DS、SS、ES)和IP;段寄存器之间不能直接传送。MOV IP,2000 H ;这是错误的
    (3)CS和IP不能作为目的操作数。MOV CS,AX ;这是错误的
    (4)MOV指令中立即数不能作目标操作数。MOV 2000H,[SI] ;这是错误的

    jmp指令用法总结:
    1.直接用法(只能在Debug下使用的汇编指令):
    jmp 段地址:偏移地址
    功能:修改CS、IP的内容
    例子:jmp 55BA:8
    执行后:(CS)=55EAH, (IP)=0008H
    2.根据标号进行转移的用法:
    (1).转移的目的地址不在指令中,依据位移进行转移(段内转移)
    a.jmp short 标号(IP的修改范围为-128至127)
    功能:(IP)=(IP)+8位位移
    b.jmp near ptr 标号(IP的修改范围为-32768至32767)
    功能:(IP)=(IP)+16位位移
    注:依据位移进行的转移是段内转移,位移=标号处的地址-jmp指令后的第一个字节的地址。
    (2).转移的目的地址在指令中(段间转移)
    jmp far ptr 标号
    功能:用标号的段地址和偏移地址修改CS和IP
    (CS)=标号所在段的段地址;(IP)=标号所在段的偏移地址
    3.转移地址在寄存器中的用法:
    jmp 某一合法寄存器
    功能:用寄存器中的值修改IP
    例子:jmp ax
    执行后:(IP)=(ax)
    注意:合法寄存器是指通用寄存器。一个有趣的现象:jmp ip在debug下调试也是
    错误的。字面上理解:(IP)=(IP),但CPU并不支持
    4.转移地址在内存中的用法:
    (1).jmp word ptr 内存单元地址(段内转移)
    功能:从内存单元地址出开始存放着一个字,是转移的目的偏移地址
    例子:mov ax,0123H
    mov [bx],ax
    jmp word ptr [bx]
    执行后:(IP)=0123H
    (2).jmp dword ptr 内存单元地址(段间转移)
    功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址
    例子:mov ax,0123H
    mov [bx],ax
    mov word ptr [bx+2],0
    jmp dword ptr [bx]
    执行后:(CS)=0, (IP)=0123H

    CALL和RET
    CALL指令的步骤:首先是将返回地址(也就是call指令要执行时EIP的值)压入栈顶,然后是将程序跳转到当前调用的方法的起始地址。执行push和jump指令。
    RET指令则是将栈顶的返回地址弹出到EIP,然后按照EIP此时指示的指令地址继续执行程序。

    pop和push
    出栈进栈

    相关文章

      网友评论

          本文标题:关于汇编

          本文链接:https://www.haomeiwen.com/subject/quscextx.html