杰爱蓝莓吧 关注:85贴子:1,090
  • 13回复贴,共1

对汇编中寄存器的一些见解

只看楼主收藏回复

通用寄存器:
ax 主要用来存放函数的返回值。特别是win32汇编中的EAX 就是用来存储API 函数 或者自定义函数返回值的
bx 一般用来村范内存地址 [bx] 这种方法很常见
cx 一般用来存放循环的次数, 在loop循环时 它里面的数据记录循环的次数 当CX 为0时 循环结束
dx 一般用来存储普通的数据
段寄存器
cs:s是指令段寄存器 它和ip寄存器一起使用 指向的内存地址存储的时 可执行代码
ss:栈相关方面的寄存器,它和sp 寄存器一起确定栈顶的指针位置


IP属地:湖南1楼2016-05-27 11:53回复
    ds 寄存器存放着 被加载程序的起始段地址
    但是dos程序为了和被加载程序进行通信 会在内存中加载一个叫PSP 的内存段
    所以被加载程序的实际运行地址是 DS+10H:0000


    IP属地:湖南2楼2016-05-27 12:05
    回复
      汇编中对可执行文件的定义:可执行文件是由描叙信息和程序组成
      程序一般指 :可执行的指令和里面的数据 也就是 我们常说的 代码段数据段 当然 也包括栈
      描叙信息 呢 一般是由编译器 处理伪指令得到的一些信息 比如程序入口地址等


      IP属地:湖南3楼2016-05-27 12:19
      回复
        assume cs:cdoesegment //让段寄存器跟程序关联
        codesegment segment // 段的开始 这里虽然段地址是放在CS 里 但是里面可以放数据 指令 以及变量 也即是栈数据
        dw 0123h,0456h,0456h
        start: //代码段的开始
        mov ax,cs
        ......
        codesegment ends //段的结束
        end start //代码段结束
        上面的代码在内存中的位置
        段地址在CS 中 数据 0123h 等放在 cs:0 ,cs:2等内存位置中
        代码段 开始的位置:CS 加上数据段的长度
        当然 如果要在debug中找到确切地址 还要看DS 里内存地址


        IP属地:湖南4楼2016-05-27 12:31
        回复
          基本上除通用寄存器外 寄存器都是成对出现
          这主要还是因为CPU 寻址原因造成的
          因为 在8086CPU 中 内存的物理地址 由段地址*16+偏移地址 构成
          所以 成对的寄存器 一个存放段地址 一个存放偏移地址 从而确定 物理地址的位置


          IP属地:湖南5楼2016-05-27 12:54
          回复
            assume cs:code,ds:date,ss:stack
            data segment
            dw 0123h,0456H
            data ends
            stack segment
            dw 0,0
            stack ends
            code segment
            start:
            mov ax,data //段名代表 段地址
            mov ax,stack // 同上
            .....
            code ends
            end start


            IP属地:湖南6楼2016-05-27 12:58
            回复
              大写字母 ASCII 码 转换为 二进制 第五位是0
              小写字母 ASCII码 转换为 二进制 第五位是1


              IP属地:湖南7楼2016-05-27 13:28
              回复
                idata 设置为常数
                [idata+bx]=idata[bx]=[bx].idata


                IP属地:湖南8楼2016-05-27 13:31
                回复
                  [idata+bx]=idata[bx]=[bx].idata
                  在高级语言中遍历数组中 有这样的操作
                  for i=0;i++;i<N
                  a[i]=巴拉巴拉
                  next
                  那么 类比 idata[bx] bx作为变量来记录内存地址的偏移量
                  虽然idata我们 设定的是常量 其实 就如 高级语言中的a 一样 a虽然看起来像变量 其实在遍历数组中
                  a作为一个‘符号’因为都没有变
                  所以我们也可以说 as是一个常量
                  也就是说 从汇编语言看高级语言的数组操作 是可以做类似比较的


                  IP属地:湖南9楼2016-05-27 13:54
                  收起回复
                    数据的暂存都使用 栈 ,所以在高级语言中 临时变量 其实也包括参数 都是存放在栈中


                    IP属地:湖南11楼2016-05-27 14:54
                    回复
                      ss 和 bp是一对寄存器 当用[bp]来代表偏移地址时 段地址都在ss中


                      IP属地:湖南12楼2016-05-27 14:55
                      回复
                        处理数据类型(byte)字节 还是(word)字符
                        1:通过寄存器判断
                        ax 是出来字符 al 处理字节
                        2:X ptr
                        word ptr 处理字符
                        byte ptr 处理字节
                        3:栈的处理是字符处理


                        IP属地:湖南13楼2016-05-27 15:15
                        回复