汇编语言-08数据处理的两个基本问题
<h2>数据处理的两个基本问题</h2><p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525101559453-379753139.png" alt=""></p>
<p>定义的描述性符号: reg和sreg,reg表示一个寄存器,用sreg表示一个段寄存器。</p>
<p>reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;<br>sreg的集合包括:ds、ss、cs、es。</p>
<h2>bx、si、di和bp</h2>
<p>在8086CPU中,只有这4个寄存器可以用在"[...]"中来进行内存单元的寻址。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525102352401-1241976081.png" alt=""></p>
<p> 在[...]中,这4个寄存器可以单个出现,或只能以4种组合出现:bx和si、bx和di、bp和si、bp和di。比如:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525102538960-259721947.png" alt=""></p>
<p>只要在[...]中<span style="text-decoration: underline"><strong><span style="color: rgba(255, 0, 0, 1); text-decoration: underline">使用寄存器bp</span></strong></span>,而指令中没有显性地给出段地址,<span style="text-decoration: underline; color: rgba(255, 0, 0, 1)"><strong>段地址就默认在ss中</strong></span>。比如:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525103022194-453920500.png" alt=""></p>
<h2>机器指令处理的数据在什么地方</h2>
<p>绝大部分机器指令都是进行数据处理的指令,处理大致可分为3 类:读取、写入、运算。在机器指令这一层来讲,并不关心数据的值是多少,而关心<strong>指令执行前一刻</strong>,它将要处理的数据所在的位置。指令在执行前,所要处理的数据可以在3个地方:CPU内部、内存、端口。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525103430505-10732871.png" alt=""></p>
<h2>汇编语言中数据位置的表达</h2>
<p>存取速度:寄存器 > 1级缓存 > 2级缓存 > 3级缓存 > 内存 > 硬盘。</p>
<p>汇编语言中用3个概念来表达数据的位置。</p>
<h3>立即数(idata)</h3>
<p>对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525105231557-215311828.png" alt=""></p>
<h3>寄存器</h3>
<p>指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525105416802-903966621.png" alt=""></p>
<h3>段地址(SA)和偏移地址(EA)</h3>
<p>指令要处理的数据在内存中,在汇编指令中可用的格式给出EA,SA在某个段寄存器中。</p>
<h4>ds段地址</h4>
<p>存放段地址的寄存器可以是默认的,<span style="text-decoration: underline"><strong><span style="color: rgba(255, 0, 0, 1); text-decoration: underline">使用常数、si、di和带有bx的组合时,段地址默认在ds</span></strong></span>,例如:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525105601069-720567902.png" alt=""></p>
<h4>ss段地址</h4>
<p><span style="text-decoration: underline"><span style="color: rgba(255, 0, 0, 1)"><strong>使用bp时,段地址默认在ss中</strong></span></span>,例如:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525105741974-92929410.png" alt=""></p>
<h4>显性给出段地址</h4>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525105730755-1083668430.png" alt=""></p>
<h2>寻址方式</h2>
<p>当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。</p>
<p>段地址(Segment Address)</p>
<p>偏移地址(Offset Address)也叫有效地址(EA,Effective Address)</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525110409360-210776560.png" alt=""></p>
<h2>指令要处理的数据有多长</h2>
<p>可以处理两种尺寸的数据,byte和word。所以在机器指令中要指明,指令进行的是字操作还是字节操作。</p>
<h3>通过<span style="text-decoration: underline">寄存器名</span>指明要处理的数据的尺寸</h3>
<p>寄存器指明了指令进行的是字操作,例如:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525111753105-1353053990.png" alt=""></p>
<p> 寄存器指明了指令进行的是字节操作,例如</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525111839154-999501738.png" alt=""></p>
<h3>ptr指明内存单元的长度</h3>
<p>在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度, X在汇编指令中可以为word或byte。</p>
<p>用word ptr指明了指令访问的内存单元是一个字单元,例如:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525112014992-1153678454.png" alt=""></p>
<p>用byte ptr指明了指令访问的内存单元是一个字节单元:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525112039633-1932316489.png" alt=""></p>
<p>在没有寄存器参与的内存单元访问指令中,用wordptr或byteptr显性地指明所要访问的内存单元的长度是很必要的。否则,CPU无法得知所要访问的单元是字单元,还是字节单元。</p>
<h4>byte ptr</h4>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525120142356-1029924451.png" alt=""></p>
<p>执行后查看结果</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525143130209-1724580959.png" alt=""></p>
<h4>word ptr</h4>
<p>用e命令修改ds:1000往后的16个字节数据为ff,然后用d查看</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525143441254-1626315194.png" alt=""></p>
<p>查看刚才写的程序,找到要修改的地方,用a命令修改</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525143747419-2007525143.png" alt=""></p>
<p>修改之后重新查看</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525143930825-927043695.png" alt=""></p>
<p>用r命令将ip指针重定向到1000:0,然后按t执行</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525144258561-433382478.png" alt=""></p>
<h3>其他方法</h3>
<p>有些指令默认了访问的是字单元还是字节单元,比如,push就不用指明访问的是字单元还是字节单元,因为push指令只进行字操作。</p>
<h2>寻址方式的综合应用</h2>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152022387-726887852.png" alt=""></p>
<p>内存中描述</p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152107759-778611799.png" alt=""></p>
<p>信息变更</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152146944-151076538.png" alt=""></p>
<p>汇编实现</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152242669-1766263933.png" alt=""></p>
<p>C语言实现</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152323800-1808934331.png" alt=""></p>
<p>C语言对应的汇编</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152422571-1043131493.png" alt=""></p>
<p> </p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152427738-1543157701.png" alt=""></p>
<h2>div指令</h2>
<p>div是除法指令,使用div做除法的时候应注意以下问题:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152704255-1060124290.png" alt=""></p>
<p>格式如下</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525152940336-757392520.png" alt=""></p>
<p>实例</p>
<p>给出8位被除数,结果存放在同样8位的al和ah中。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525153323155-92957668.png" alt=""></p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526103004999-45022388.png" alt=""></p>
<p>给出16位被除数,结果存放在同样16位的ax和dx中。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200525153346585-706110733.png" alt=""></p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526103854915-1863264094.png" alt=""></p>
<p>dx高16位需要右移16位,即乘以2^16(十六进制为10000H),在加上低位的ax中存的值即计算出被除数。</p>
<h3>利用除法指令计算100001/100</h3>
<p>被除数100001大于65535,不能用ax寄存器存放,所以只能用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。除数100小于255,可以在一个8位寄存器中存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100。</p>
<p>100001的十六进制为186A1H,高十六位为1,低十六位为86A1。100的十六进制为64H。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526152137883-352796206.png" alt=""></p>
<p>程序执行后,(ax)=03E8H(即1000),(dx)=1(余数为1)。</p>
<p> <img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526151526746-850479110.png" alt=""></p>
<h3>利用除法指令计算1001/100</h3>
<p>被除数1001(3E9H)可用ax寄存器存放,除数100(64H)可用8位寄存器存放,也就是说,要进行8位的除法。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526153228142-1162341978.png" alt=""></p>
<p>程序执行后,(al)=0AH(即10),(ah)=1(余数为1)。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526153318317-1224428556.png" alt=""></p>
<h2>伪指令dd</h2>
<p>前面我们用db和dw定义字节型数据和字型数据。dd是用来定义dword(double word,双字)型数据的。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">data segment
db </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
dw </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
dd </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
data ends</span></pre>
</div>
<p>在data段中定义了3个数据:<br>第一个数据为01H,在data:0处,占1个字节;<br>第二个数据为0001H,在data:l处,占1个字;<br>第三个数据为00000001H,在data:3处,占2个字。</p>
<p>用div计算data段中第一个数据除以第二个数据后的结果,商存在第三个数据的存储单元中。</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526155151308-1121124161.png" alt=""></p>
<p>分析:</p>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526155322807-1525140710.png" alt=""></p>
<h2>dup</h2>
<p>dup(全称:duplicate)是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号。它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。</p>
<h3>使用格式</h3>
<p><img src="https://img2020.cnblogs.com/blog/1208477/202005/1208477-20200526160534794-934591779.png" alt=""></p>
<p> </p>
<p>例如: </p>
<div class="cnblogs_code">
<pre>db <span style="color: rgba(128, 0, 128, 1)">3</span> dup (<span style="color: rgba(128, 0, 128, 1)">0</span>)</pre>
</div>
<p>定义了3 个字节,它们的值都是0,相当千db 0,0,0 。</p>
<div class="cnblogs_code">
<pre>db <span style="color: rgba(128, 0, 128, 1)">3</span> dup (<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">1</span>,<span style="color: rgba(128, 0, 128, 1)">2</span>)</pre>
</div>
<p>定义了9个字节,它们是0、l、2、0、1、2、0、1、2,相当千db 0,1,2,0,1,2,0,1,2。</p>
<div class="cnblogs_code">
<pre>db <span style="color: rgba(128, 0, 128, 1)">3</span> dup (<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">abc</span><span style="color: rgba(128, 0, 0, 1)">'</span>,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ABC</span><span style="color: rgba(128, 0, 0, 1)">'</span>)</pre>
</div>
<p>定义了18个字节,它们是abcABCabcABCabcABC,相当千db ‘abcABCabcABCabcABC’。</p>
<h3>定义一个容量为200个字节的栈段</h3>
<h4>不用dup</h4>
<p>用dw声明100个字,即开辟了200个字节的空间。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">stack segment
dw </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
dw </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
dw </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
dw </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
dw </span><span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
stack ends</span></pre>
</div>
<h4>使用dup</h4>
<p>直接用db声明200个字节,内容为0。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">stack segment
db </span><span style="color: rgba(128, 0, 128, 1)">200</span> dup (<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
stack ends</span></pre>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
如果这篇文章对你有用,可以关注本人微信公众号获取更多ヽ(^ω^)ノ~<br>
<img id="ViewPicture1_GalleryImage" alt="微信公众号二维码" src="https://images.cnblogs.com/cnblogs_com/aeolian/1679458/o_wechat_gzh_qrcode.jpg" style="height: 258 px; width: 258 px; border-width: 0px">
<br><br><br>
来源:https://www.cnblogs.com/aeolian/p/12938171.html
頁:
[1]