汇编语言期末复习——第三章 通用数据处理指令
<p>一、数据传送类指令</p><ol>
<li>通用传送指令——MOV
<ul>
<li>mov指令并非任意传送:
<ul>
<li>源操作数和目的操作数<span style="color: rgba(255, 0, 0, 1)"><strong>不能同时为主存储器操作数</strong></span>
<ul>
<li><strong><strong> </strong></strong>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span>DBUF2,DBUF1 <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">错误</span>
<span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> AX,DBUF1
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span> DBUF2,AX <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">正确</span></pre>
</div>
</li>
</ul>
</li>
<li>源操作数和目的操作数<span style="color: rgba(255, 0, 0, 1)"><strong>不能同时为段寄存器操作数</strong></span></li>
<li><span style="color: rgba(255, 0, 0, 1)"><strong>立即数不能直接传送给段寄存器</strong></span>
<ul>
<li><strong><strong> </strong></strong>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> DS, @DATA <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">错误</span>
<span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> AX,@DATA
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span> DS,AX <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">正确</span></pre>
</div>
</li>
</ul>
</li>
<li><strong><span style="color: rgba(255, 0, 0, 1)">传送时双操作数必须类型一致</span></strong>
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> SI,DL <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">错误:类型不一致 SI16位,DL8位</span>
<span style="color: rgba(0, 0, 255, 1)">MOV</span> AL,050AH <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">错误:类型不一致 050AH超过AL范围</span> </pre>
</div>
</li>
</ul>
</li>
<li><strong><span style="color: rgba(255, 0, 0, 1)">操作数必须要有明确的类型</span></strong>
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> ,<span style="color: rgba(128, 0, 128, 1)">255</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">错误:无明确类型</span>
<span style="color: rgba(0, 0, 255, 1)">MOV</span> BYTE PTR , <span style="color: rgba(128, 0, 128, 1)">255</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">正确,byte ptr说明是字节操作</span></pre>
</div>
<p> </p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>通用传送指令——XCHG
<ul>
<li>将源操作数和目的操作数的内容交换</li>
<li>可以使用于<strong>通用寄存器与通用寄存器之间</strong>或者<strong>通用存储器与存储器之间</strong>
<ul>
<li> 例子:
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">XCHG</span><span style="color: rgba(0, 0, 0, 1)"> SI,DI
</span><span style="color: rgba(0, 0, 255, 1)">XCHG</span><span style="color: rgba(0, 0, 0, 1)"> SI,
</span><span style="color: rgba(0, 0, 255, 1)">XCHG</span> AL,BVAR</pre>
</div>
<p> </p>
</li>
<li>空操作指令NOP(=XCHG AX,AX)</li>
</ul>
</li>
</ul>
</li>
<li>堆栈操作指令
<ul>
<li>只有一个数据出入口——当前栈顶</li>
<li>两种基本操作<br>
<ul>
<li>push
<ul>
<li>SP-2作为当前栈顶</li>
<li>将源操作数(通用寄存器/段寄存内容/存储器操作数)传送到栈顶</li>
<li>以字为单位进行操作</li>
</ul>
</li>
<li>pop
<ul>
<li>SP+2作为当前栈顶</li>
<li>将栈顶数据传送到目的操作数(通用寄存器/段寄存内容/存储器操作数)</li>
<li>以字为单位进行操作</li>
</ul>
</li>
</ul>
</li>
<li>SS指向堆栈段的起始位置(段基地址) SP指定栈顶
<ul>
<li><strong>数据进入堆栈,SP逐渐减小</strong></li>
<li><strong>数据依次弹除,SP逐渐增大</strong></li>
</ul>
</li>
<li>堆栈的应用
<ul>
<li>堆栈操作指令</li>
<li>子程序调用CALL和返回RET</li>
<li>中断调用INT和返回IRET</li>
<li>内部异常、外部中断</li>
<li>存放临时数据,以便随时恢复</li>
<li>子程序的寄存器的保护和恢复</li>
</ul>
</li>
</ul>
</li>
<li>地址传送指令
<ul>
<li>获取存储器操作数的地址</li>
<li>格式:LEA R16,MEM</li>
<li>类似OFFSET的作用
<ul>
<li>LEA<strong>在指令执行时计算出偏移地址</strong></li>
<li>OFFSET操作符在汇编阶段取得变量的偏移地址</li>
<li>OFFSET无需在执行时计算,执行速度更快</li>
<li><strong>LEA能获取汇编阶段无法确定的偏移地址</strong></li>
</ul>
</li>
<li>例:
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">LEA</span><span style="color: rgba(0, 0, 0, 1)"> SI,VAR
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> DI,OFFSET VAR
</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">等价</span></pre>
</div>
<div class="cnblogs_code">
<pre><strong><span style="color: rgba(0, 0, 255, 1)">LEA</span> DX, <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">先进行加法运算得到偏移地址再传送给DX寄存器(相对基址变址寻址方式)</span></strong>
<span style="color: rgba(0, 0, 255, 1)">MOV</span> DX,OFFSET <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">是错误的,因为汇编时不知道执行DX和DI等于什么</span></pre>
</div>
<p> </p>
</li>
<li>其他的:指针传送指令LDS和LES,能将主存连续四个字节内容的前两个分别传送给DS和ES后续字节作为偏移地址传送给指令的十六位通用寄存器。</li>
</ul>
</li>
<li>换码指令
<ul>
<li>XLAT指令功能:AL←
<ul>
<li>指令执行前:<br>
<ul>
<li>在主存建立一个字节量表格</li>
<li>表格首地址放于BX</li>
<li>AL存放相对表格首地址的位移量</li>
</ul>
</li>
<li>指令执行后:
<ul>
<li>将AL寄存器的内容转换为目标代码</li>
</ul>
</li>
</ul>
</li>
<li>例:
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">eg303.asm</span>
<span style="color: rgba(0, 0, 0, 1)"> .model small
.stack
.data
num db </span><span style="color: rgba(128, 0, 128, 1)">6</span>,<span style="color: rgba(128, 0, 128, 1)">7</span>,<span style="color: rgba(128, 0, 128, 1)">7</span>,<span style="color: rgba(128, 0, 128, 1)">8</span>,<span style="color: rgba(128, 0, 128, 1)">3</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)">
tab db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">0123456789</span><span style="color: rgba(128, 0, 0, 1)">' </span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">代码表</span>
<span style="color: rgba(0, 0, 0, 1)"> .code
.startup
</span><span style="color: rgba(0, 0, 255, 1)">mov</span> cx,lengthof num <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">CX等于要转换数字的个数</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span> si,offset num <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">SI指向要转换的数字</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span> bx,offset tab <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">BX指向代码表</span>
<span style="color: rgba(0, 128, 128, 1)">again:</span> <span style="color: rgba(0, 0, 255, 1)">mov</span> al, <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL←要转换的数字</span>
<span style="color: rgba(0, 0, 255, 1)">xlat</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">换码,AL得到数字的ASCII值</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span> dl,al <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">显示</span>
<span style="color: rgba(0, 0, 255, 1)">mov</span> ah,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
</span><span style="color: rgba(0, 0, 255, 1)">add</span> si,<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">指向下一个数字</span>
loop again <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">循环</span>
<span style="color: rgba(0, 0, 0, 1)"> .exit
end</span></pre>
</div>
<p> </p>
</li>
</ul>
</li>
<li>标志传送指令
<ul>
<li>可以直接改变CF、DF、IF状态的标志位操作指令</li>
<li>教材P73</li>
</ul>
</li>
<li>输入输出指令
<ul>
<li>输入指令IN:数据从IO接口输入到微处理器
<ul>
<li>IN AL,21H</li>
<li>IN AL,DX</li>
</ul>
</li>
<li>输出指令OUT:数据从微处理器输出IO接口
<ul>
<li>OUT 21H,AL</li>
<li>OUT DX,AL</li>
</ul>
</li>
<li>IO寻址方式:直接寻址&DX间接寻址
<ul>
<li>直接寻址由IO指令直接提供8位IO地址 只能寻址最低256个IO地址 用i8表示</li>
<li>间接寻址用DX寄存器保存访问的IO地址 可以寻址全部IO地址(0000~FFFFH) 直接写成DX,表示IO地址</li>
<li>8位IO传输:IO指令使用AL</li>
<li>16位IO传输:IO指令使用AX</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>二、算数运算类指令</p>
<ol>
<li>状态标志
<ul>
<li>CF 进位标志 针对无符号数
<ul>
<li>当加减法运算结果的最高有效位有进位或借位 CF=1</li>
<li>N个二进制位表达无符号整数的范围:0~pow(2,N)-1</li>
<li>有进位加上进位或借位后结果仍然正确</li>
</ul>
</li>
<li>OF 溢出标志 针对有符号数
<ul>
<li>加减结果有溢出 OF=1</li>
<li>N个二进制位(补码)表达有符号整数的范围:-pow(2,N-1)~pow(2,N-1)-1</li>
<li>有溢出,运算结果已经不正确</li>
<li>判断:
<ul>
<li>最高位和次高位同时有进位或同时无进位,无溢出;最高位和次高位进位状态不同,有溢出</li>
<li><strong>只有两个相同符号数数相加(或两个不同符号数相减),而<span style="color: rgba(255, 0, 0, 1)">运算结果的符号与原数据符号相反时产生溢出</span></strong>,其他情况无溢出。</li>
</ul>
</li>
</ul>
</li>
<li>ZF 零标志 </li>
<ul>
<li>运算结果位0,ZF=1</li>
</ul>
<li>SF 符号标志</li>
<ul>
<li>运算结果最高位为1,SF=1</li>
</ul>
<li>PF 奇偶标志
<ul>
<li>运算结果最低字节(最低8位)中“1”的个数为零或偶数,PF=1</li>
</ul>
</li>
<li>AF 辅助进位标志/调整标志
<ul>
<li>最低半字节有进位或借位时,AF=1</li>
</ul>
</li>
<li>查看状态标志方法:
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">PUSHF</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">将标志寄存器的值入栈</span>
<span style="color: rgba(0, 0, 255, 1)">POP</span> AX<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">将标志寄存器的值出栈赋值给AX<br></span></pre>
</div>
</li>
</ul>
</li>
</ul>
</li>
<li>加法指令
<ul>
<li>ADD
<ul>
<li>双操作数。目的操作数加上源操作数,和送回目的操作数</li>
<li>按照定义影响六个状态标志位</li>
</ul>
</li>
<li>ADC
<ul>
<li>两个操作数相加再加CF,结果送回目的操作数</li>
<li>按照定义影响六个标志位</li>
</ul>
</li>
<li>INC
<ul>
<li>一个操作数,实现对操作数自增一,再将结果返回原处</li>
<li>不影响CF,但影响其他标志位</li>
</ul>
</li>
</ul>
</li>
<li>减法指令
<ul>
<li>SUB
<ul>
<li>目的操作数减去源操作数,结果送回目的操作数</li>
<li>按照定义影响六个标志位</li>
</ul>
</li>
<li>SBB
<ul>
<li>除完成SUB减法运算外,还要减去借位CF,结果送回目的操作数</li>
<li>按照定义影响六个标志位</li>
</ul>
</li>
<li>DEC
<ul>
<li>对操作数减一再将结果返回原处</li>
<li>不影响CF,但影响其他标志位</li>
</ul>
</li>
<li>NEG
<ul>
<li>求补指令 单操作数</li>
<li>用零减去操作数,将结果返回操作数</li>
<li>按照定义影响六个标志位</li>
</ul>
</li>
<li>CMP
<ul>
<li>将目的操作数减去源操作数,差值不送回。</li>
<li>按照减法结果影响标志</li>
</ul>
</li>
</ul>
</li>
<li>乘法指令
<ul>
<li>MUL/IMUL(无符号数/有符号数)
<ul>
<li>隐含使用目的操作数AX</li>
<li>源操作数为8位数:AL与其相乘得到16位积,存入AX</li>
<li>源操作数为16位:AX与其相乘得到32位积,高16位存入DX,低16位存入AX</li>
</ul>
</li>
<li>对标志的影响:
<ul>
<li>若乘积的高一半是低一半的符号位扩展,说明高一半不含有效数值,则OF=CF=0</li>
<li>若高一半有效,则OF=CF=1</li>
<li>乘法指令对其他标志状态没有定义,即为任意,不可预测</li>
</ul>
</li>
</ul>
</li>
<li>除法指令
<ul>
<li>DIV/IDIV(无符号数/有符号数)
<ul>
<li>隐含使用目的操作数AX</li>
<li>8位除法:AL=AX÷源操作数的商,AH=AX÷源操作数的余数</li>
<li>16位除法:AX=DX.AX÷源操作数的商,DX=DX.AX÷源操作数的余数</li>
</ul>
</li>
</ul>
</li>
<li>符号扩展指令
<ul>
<li>CBW :AL扩展到AX</li>
<li>CWD:AX扩展到DX.AX</li>
</ul>
</li>
</ol>
<p>三、位操作类指令</p>
<ol>
<li>逻辑运算指令
<ul>
<li>AND
<ul>
<li>同0与 复位</li>
</ul>
</li>
<li>OR
<ul>
<li>同1或 置位</li>
</ul>
</li>
<li>NOT</li>
<li>XOR
<ul>
<li>“与1异或取反,与0异或不变”</li>
<li>最快的将寄存器清零的方法:XOR DX,DX</li>
</ul>
</li>
<li>TEST
<ul>
<li>将两个操作数按位进行逻辑与运算,不返回逻辑与的结果,根据结果像AND指令一样设置状态标志。</li>
</ul>
</li>
<li>除NOT不影响标志外,其他逻辑指令讲OF=CF=0,按定义影响ZF、SF、PF</li>
</ul>
</li>
<li>移位指令
<ul>
<li>移位
<ul>
<li>shl 逻辑左移:左移1/CL位,最低位补零,最高位进入CF
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1111 0101B</span>
<span style="color: rgba(0, 0, 255, 1)">SHL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1110 1010B CF=1</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">OF=0</span></pre>
</div>
</li>
</ul>
</li>
<li>shr 逻辑右移:右移1/CL位,最高位补零,最低位进入CF
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1111 0101B</span>
<span style="color: rgba(0, 0, 255, 1)">SHR</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=0111 1010B</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">CF=1 OF=1</span></pre>
</div>
</li>
</ul>
</li>
<li>sal 同shl</li>
<li>sar 算数右移:右移1/CL位,<strong><span style="color: rgba(0, 0, 0, 1)">最高位不变</span></strong>,最低为进入CF
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1111 0101B</span>
<span style="color: rgba(0, 0, 255, 1)">SAR</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1111 1010B</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">CF=1 OF=0</span></pre>
</div>
</li>
</ul>
</li>
<li><span style="color: rgba(255, 0, 0, 1)"><strong>源操作数只能是1或者CL</strong></span></li>
<li><span style="color: rgba(0, 0, 0, 1)">根据最高或最低位移处的位设置CF</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">根据移位后的结果影响SF,ZF,PF</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">如果<strong>进行一位移动</strong>,按照操作数的最高符号是否改变设置溢出标志OF:</span>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)"><strong>移位前最高位与移位后最高位不同:OF=1</strong></span></li>
</ul>
</li>
<li><span style="color: rgba(0, 0, 0, 1)"><strong>移位次数不为1时OF不确定。</strong></span></li>
<li><span style="color: rgba(0, 0, 0, 1)">逻辑左移相当于乘二,逻辑右移相当于除二。 商在操作数中,余数由CF标志反映。</span></li>
</ul>
</li>
<li>循环移位
<ul>
<li>rol 不带进位循环左移:左移1/CL位,最高位进入CF和最低位
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1110 0101B</span>
<span style="color: rgba(0, 0, 255, 1)">ROL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1100 1011</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">CF=1 OF=0</span></pre>
</div>
</li>
</ul>
</li>
<li>ror 不带进位循环右移:右移1/CL位,最低位进入CF和最高位
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1110 0101B CL=2</span>
<span style="color: rgba(0, 0, 255, 1)">ROR</span><span style="color: rgba(0, 0, 0, 1)"> AL,CL
</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=0111 1001B</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">CF=0</span></pre>
</div>
</li>
</ul>
</li>
<li>rcl 带进位循环左移:左移1/CL位,最高位进入CF,CF进入最低位
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1110 0101B CF=0</span>
<span style="color: rgba(0, 0, 255, 1)">RCL</span> AL,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1100 1010B</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">CF=1 OF=0</span></pre>
</div>
</li>
</ul>
</li>
<li>rcr 带进位循环右移:右移1/CL位,最低位进入CF,CF进入最高位
<ul>
<li>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=1110 0101B CL=4 CF=0</span>
<span style="color: rgba(0, 0, 255, 1)">RCR</span><span style="color: rgba(0, 0, 0, 1)"> AL,CL
</span><span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">1 AL=0111 0010B CF=1</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">2 AL=1011 1001B CF=0</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">3 AL=0101 1100B CF=1</span><span style="color: rgba(0, 128, 0, 1)">
;</span><span style="color: rgba(0, 128, 0, 1)">4 AL=1010 1110B CF=0</span></pre>
</div>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>四、课后习题!</p>
<p>3.1 (1)如何修改"MOV SI,BYTE PTR 250"语句使其正确?</p>
<p> MOV SI,250 </p>
<p> (2)为什么说“XCHG DX,CL"是一条错误的指令?</p>
<p> 源寄存器操作数和目的寄存器操作数位数不同。</p>
<p> (5)执行了一条加法指令后,发现ZF=1,说明结果是什么?</p>
<p> 0</p>
<p> (7)大小写字母转换使用了什么规律?</p>
<p> 相差20H。</p>
<p> (9)除法指令”DIV SI"的被除数是什么?</p>
<p> 被除数32位,DX保存高16位,AX保存低16位。</p>
<p>3.2 判断题</p>
<p> (1)指令“MOV AX,0”使AX结果为0,所以标志位ZF=1。</p>
<p> 错,MOV XCHG不影响标志位</p>
<p> (4)虽然ADD指令和SUB指令执行后会影响标志状态,但执行前的标志并不影响它们的执行结果。</p>
<p> 对。</p>
<p> (5)80-90需要借位,所以执行结束后,进位标志CF=1.</p>
<p> 对。</p>
<p> (7)无符号数在前面加零扩展,数值不变;有符号数前面进行符号扩展,位数加长一位,数值增加一倍。</p>
<p> 错。符号扩展不改变数值大小。有符号数的符号扩展扩展的是符号位。</p>
<p> (10)SHL指令左移一位,就是乘10.</p>
<p> 错。是*2。</p>
<p>3.3 填空题</p>
<p> (1)指令"PUSH DX"执行后,SP<span style="text-decoration: underline"> -2 </span>。</p>
<p> (2)指令"POP DX"的功能是将堆栈顶部的数据传送给<span style="text-decoration: underline"> DX </span>,然后<span style="text-decoration: underline"> SP+2 </span>。</p>
<p> (4)进行8位的二进制数加法BAH+6CH,8位结果是<span style="text-decoration: underline"> 26H </span> ,标志PF=<span style="text-decoration: underline"> 0 </span>。如果进行16位二进制数加法45BAH+786CH,16位结果是<span style="text-decoration: underline"> 0BE26 </span>,标志PF=<span style="text-decoration: underline"> 0 </span>。</p>
<p> (5)假设AX=98H,执行NEG AX指令后,AX=<span style="text-decoration: underline"> 0FF68H </span>,标志SF=<span style="text-decoration: underline"> 1 </span>。<span><br></span></p>
<p> (8)指令“XOR AX,AX”和“SUB AX,AX”执行后,AX=<span style="text-decoration: underline"><span> 0 </span></span>。CF=OF=<span style="text-decoration: underline"> 0 </span>。而指令"MOV AX,0"执行后,AX=<span style="text-decoration: underline"> 0 </span>,CF和OF没有变化。</p>
<p> (10)欲将DX内的无符号数除以16,可以使用指令"SHR DX,<span style="text-decoration: underline"> CL </span>",其中后一个操作数是一个8位寄存器,其值等于<span style="text-decoration: underline"> 4 </span>。</p>
<p>3.5 操作数的组合通常符合逻辑,但不是任意的,指出下列指令的错误原因:</p>
<p> (1)MOV CX,DL 位数不同(类型不匹配)</p>
<p> (2)MOV IP,AX IP为专用寄存器,不能赋值</p>
<p> (3)MOV ES,1234H 不能直接将立即数赋值给段寄存器</p>
<p> (4)MOV ES,DS 段寄存器之间不能赋值</p>
<p> (5)MOV AL,300 位数不同</p>
<p> (6)MOV ,45H 没有明确类型</p>
<p> (7)MOV AX,BX+DI 无该种寻址方式</p>
<p> (8)MOV 20H,AH 不能给立即数赋值</p>
<p>3.6 使用MOV指令实现交换指令“XCHG BX,”功能。</p>
<p> MOV AX,</p>
<p> MOV BX,AX</p>
<p> MOV ,BX</p>
<p>3.11 分别执行如下程序片段,说明每条指令的执行结果:</p>
<p> (1)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> AX,80H <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">0080H</span></span>
<span style="color: rgba(0, 0, 255, 1)">ADD</span> AX,<span style="color: rgba(128, 0, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">0083H</span>,CF=<span style="text-decoration: underline"> 0 </span>,SF=<span style="text-decoration: underline"> 0 </span> </span>
<span style="color: rgba(0, 0, 255, 1)">ADD</span> AX,80H <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">0103H</span>,CF=<span style="text-decoration: underline"> 0 </span>,OF=<span style="text-decoration: underline"> 0 <br></span></span>
<span style="color: rgba(0, 0, 255, 1)">ADC</span> AX,<span style="color: rgba(128, 0, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">0106H</span>,CF=<span style="text-decoration: underline"> 0 </span>,ZF=<span style="text-decoration: underline"> 0 </span></span></pre>
</div>
<p> </p>
<p> (2)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> AX,<span style="color: rgba(128, 0, 128, 1)">100</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">64H </span> </span>
<span style="color: rgba(0, 0, 255, 1)">ADD</span> AX,<span style="color: rgba(128, 0, 128, 1)">200</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">12CH </span>,CF=<span style="text-decoration: underline"> 0 </span></span></pre>
</div>
<p> </p>
<p> (3)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> AX,<span style="color: rgba(128, 0, 128, 1)">100</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">64H</span></span>
<span style="color: rgba(0, 0, 255, 1)">ADD</span> AL,<span style="color: rgba(128, 0, 128, 1)">200</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">2CH</span>,CF=<span style="text-decoration: underline"> 1 </span></span></pre>
</div>
<p> </p>
<p> (4)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> AL,7FH <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=<span style="text-decoration: underline"> 7FH </span></span>
<span style="color: rgba(0, 0, 255, 1)">SUB</span> AL,<span style="color: rgba(128, 0, 128, 1)">8</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=<span style="text-decoration: underline"> 77H </span>,CF=<span style="text-decoration: underline"> 0 </span>,SF=<span style="text-decoration: underline"> 0 </span></span>
<span style="color: rgba(0, 0, 255, 1)">SUB</span> AL,80H <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=<span style="text-decoration: underline"> F7H </span>,CF=<span style="text-decoration: underline"> 1 </span>,OF=<span style="text-decoration: underline; color: rgba(255, 0, 0, 1)"> 1 </span></span>
<span style="color: rgba(0, 0, 255, 1)">SBB</span> AL,<span style="color: rgba(128, 0, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AL=<span style="text-decoration: underline"> F3H </span>,CF=<span style="text-decoration: underline"> 0 </span>,ZF=<span style="text-decoration: underline"> 0 </span></span></pre>
</div>
<p> </p>
<p>3.14 请分别用一条汇编语言指令完成如下功能:</p>
<p> (1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器</p>
<p> ADD DX,BX</p>
<p> (2)用寄存器BX和SI的基址变址寻址方式把存储器中的一个字节和AL寄存器的内容相加,并把结果送到AL中。</p>
<p> ADD AL, </p>
<p> (3)用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的内容相加,并把结果送回存储器中。</p>
<p> ADD ,CX</p>
<p> (4)将16为变量VARW与数3412H相加,并把结果送回该存储单元中。</p>
<p> ADD VARW,3412H</p>
<p> (5)把数0A0H与AX寄存器的内容相加,并把结果送回AX中。</p>
<p> ADD AX,0A0H </p>
<p>3.16 分别执行如下程序片段,说明每条指令的执行结果:</p>
<p> (1)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> SI,1<span style="color: rgba(128, 0, 128, 1)">0011100B</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">SI=<span style="text-decoration: underline"> 9C </span>H</span>
<span style="color: rgba(0, 0, 255, 1)">AND</span> SI,80H <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">SI=<span style="text-decoration: underline"> 80 </span>H</span>
<span style="color: rgba(0, 0, 255, 1)">OR</span> SI,7FH <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">SI=<span style="text-decoration: underline"> FF </span>H</span>
<span style="color: rgba(0, 0, 255, 1)">XOR</span> SI,0FEH <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">SI=<span style="text-decoration: underline"> 1 </span>H</span></pre>
</div>
<p> </p>
<p> (2)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> AX,1<span style="color: rgba(128, 0, 128, 1)">010B</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0000 1010 </span>B</span>
<span style="color: rgba(0, 0, 255, 1)">MOV</span> CL,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 0, 255, 1)">SHR</span> AX,CL <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0000 0010 </span>B,CF=<span style="text-decoration: underline">1</span></span>
<span style="color: rgba(0, 0, 255, 1)">SHL</span>AX,<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0000 0100 </span>B,CF=<span style="text-decoration: underline">0</span></span>
<span style="color: rgba(0, 0, 255, 1)">AND</span> AX,<span style="color: rgba(128, 0, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0000 0000 </span>B,CF=<span style="text-decoration: underline">0</span></span></pre>
</div>
<p> </p>
<p> (3)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span> AX,1<span style="color: rgba(128, 0, 128, 1)">011B</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0000 1011 </span>B</span>
<span style="color: rgba(0, 0, 255, 1)">MOV</span> CL,<span style="color: rgba(128, 0, 128, 1)">2</span>
<span style="color: rgba(0, 0, 255, 1)">ROL</span> AX,CL <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0010 1100</span>B,CF=<span style="text-decoration: underline">0</span></span>
<span style="color: rgba(0, 0, 255, 1)">RCR</span> AX,<span style="color: rgba(128, 0, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0001 0110 </span>B,CF=<span style="text-decoration: underline">0</span></span>
<span style="color: rgba(0, 0, 255, 1)">OR</span> AX,<span style="color: rgba(128, 0, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline"> 0000 0000 0001 0111 </span>B,CF=<span style="text-decoration: underline">0</span></span></pre>
</div>
<p> </p>
<p> (4)</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">XOR</span> AX,AX <span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">AX=<span style="text-decoration: underline">0</span>,CF=<span style="text-decoration: underline">0</span>,OF=<span style="text-decoration: underline">0</span></span>
<span style="color: rgba(0, 128, 0, 1)">;</span><span style="color: rgba(0, 128, 0, 1)">ZF=<span style="text-decoration: underline">1</span>,SF=<span style="text-decoration: underline">0</span>,PF=<span style="text-decoration: underline">1</span></span></pre>
</div>
<p> </p>
<p>3.21 如下程序片段实现AX乘以某个数X的功能,请判断X=?请使用一条乘法指令实现上述功能。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> SI,AX
</span><span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">SUB</span><span style="color: rgba(0, 0, 0, 1)"> SI,AX
</span><span style="color: rgba(0, 0, 255, 1)">MOV</span> AX,SI</pre>
</div>
<p> </p>
<p>答:本程序段相当于:AX*2*2*2-AX=AX*7</p>
<p> 故X=7</p>
<p>使用一条乘法指令为:</p>
<p> mul ax,7</p>
<p>3.22请使用移位和减法指令编写一个程序片段计算:AX×21,假设乘积不超过16位。(提示:21=pow(2,4)+pow(2,2)+pow(2,0))。</p>
<p>答:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">MOV</span><span style="color: rgba(0, 0, 0, 1)"> SI,AX
</span><span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">ADD</span><span style="color: rgba(0, 0, 0, 1)"> AX,SI
</span><span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">SHL</span> SI,<span style="color: rgba(128, 0, 128, 1)">1</span>
<span style="color: rgba(0, 0, 255, 1)">ADD</span> AX,SI</pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/hotaru-klxx/p/15514838.html
頁:
[1]