天上飘着五个字 發表於 2021-11-27 17:42:00

汇编语言实验三

<p>1.任务一</p>
<p>程序代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">assume cs:code, ds:data

data segment
    x db </span><span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">
    len1 equ $ </span>-<span style="color: rgba(0, 0, 0, 1)"> x

    y dw </span><span style="color: rgba(128, 0, 128, 1)">1</span>, <span style="color: rgba(128, 0, 128, 1)">9</span>, <span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">
    len2 equ $ </span>-<span style="color: rgba(0, 0, 0, 1)"> y
data ends

code segment
start:
    mov ax, data
    mov ds, ax

    mov si, offset x
    mov cx, len1
    mov ah, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
s1:mov dl,
    or dl, 30h
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

    mov dl, </span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

    inc si
    loop s1

    mov ah, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
    mov dl, 0ah
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

    mov si, offset y
    mov cx, len2</span>/<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
    mov ah, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
s2:mov dx,
    or dl, 30h
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

    mov dl, </span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span>
    <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

    add si, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
    loop s2

    mov ah, 4ch
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
code ends
end start</span></pre>
</div>
<p>程序执行结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211126110529608-1376665201.png"></p>
<p>&nbsp;</p>
<p>1.</p>
<p>&nbsp;EQU 伪指令把一个符号名称与一个整数表达式或一个任意文本连接起来;</p>
<p>“$” 是汇编语言中的一个预定义符号,等价于当前正汇编到的段的当前偏移值;</p>
<p>offset:取标号的偏移地址;</p>
<p>2.回答问题</p>
<p>(1)</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211126112039723-291428605.png"></p>
<p>&nbsp;</p>
<p>&nbsp;loop处机器码为E2F2,指令实现的是段内短转移,范围是-128~127,后两位是位移量的补码形式,转换为二进制是11110010,</p>
<p>转换为原码为10001110,转化为十进制为-(2+4+8)=-14,即向前14个字节,loop处偏移量为0019H,转换为十进制是16+9=25,</p>
<p>又因为loop指令占2字节,所以读取完这条指令ip值自动+2,即为25+2=27;27-14=13为跳转到的指令的偏移地址,转换为16进制为</p>
<p>000D,发现正是s1标号处的偏移地址,跳转成功。</p>
<p>(2)</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211126113310559-383876258.png"></p>
<p>&nbsp;</p>
<p>&nbsp;同上,loop指令机器码为E2F0,位移量补码11110000,原码10010000,十进制-16,当前指令读取完毕ip值变为0039,即9+16*3=57,57-16</p>
<p>=41=2*16+9,转化为16进制为0029,即为标号s2处偏移地址。</p>
<p>&nbsp;</p>
<p>2.实验任务二</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">assume cs:code, ds:data

data segment
    dw 200h, 0h, 230h, 0h
data ends

stack segment
    db </span><span style="color: rgba(128, 0, 128, 1)">16</span> dup(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
stack ends

code segment
start:
    mov ax, data
    mov ds, ax

    mov word ptr ds:[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">], offset s1
    mov word ptr ds:[</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">], offset s2
    mov ds:[</span><span style="color: rgba(128, 0, 128, 1)">4</span><span style="color: rgba(0, 0, 0, 1)">], cs

    mov ax, stack
    mov ss, ax
    mov sp, </span><span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">

    call word ptr ds:[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]
s1: pop ax

    call dword ptr ds:[</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">]
s2: pop bx
    pop cx

    mov ah, 4ch
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
code ends
end start</span></pre>
</div>
<p>&nbsp;</p>
<p>(1)查阅资料可知:</p>
<p><em><code><code>call word ptr 内存单元地址</code>,相当于<code>push IP AND jmp word ptr 内存单元地址</code>。 <br><code>call dword ptr 内存单元地址</code>,相当于<code>push CS AND push IP AND jmp dword ptr 内存单元地址。</code></code></em><code><br></code></p>
<p>(ax)=offset s1;</p>
<pre><span style="color: rgba(0, 0, 0, 1)">call dword ptr ds:[<span style="color: rgba(128, 0, 128, 1)">2<span style="color: rgba(0, 0, 0, 1)">]执行后,栈依次弹出这条call指令的下一条指令的ip和cs;下一条指令的cs就为code段起始地址,ip为编号s2;</span></span></span></pre>
<p>(bx)=offset s2;</p>
<p>(cx)=code</p>
<p>(2)结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211127162058427-568797471.png"></p>
<p>&nbsp;</p>
<p>&nbsp;可见执行完call指令后,ip下一条指令的偏移地址0021,即将0021压栈,pop ax后,ax为0021;</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211127162858847-578607652.png"></p>
<p>&nbsp;</p>
<p>&nbsp;应当进栈的cs:ip为076c:0026,发现bx=0026,ip先出栈,cx=076c,cs再出栈。</p>
<p>&nbsp;</p>
<p>3.实验任务3</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">assume cs:code, ds:data

data segment
      x db </span><span style="color: rgba(128, 0, 128, 1)">99</span>, <span style="color: rgba(128, 0, 128, 1)">72</span>, <span style="color: rgba(128, 0, 128, 1)">85</span>, <span style="color: rgba(128, 0, 128, 1)">63</span>, <span style="color: rgba(128, 0, 128, 1)">89</span>, <span style="color: rgba(128, 0, 128, 1)">97</span>, <span style="color: rgba(128, 0, 128, 1)">55</span><span style="color: rgba(0, 0, 0, 1)">
      len equ $ </span>-<span style="color: rgba(0, 0, 0, 1)"> x
data ends

code segment
start:
      mov ax, data
      mov ds, ax
      mov si, offset x ;第一个数据的偏移地址
      mov cx, </span><span style="color: rgba(128, 0, 128, 1)">7</span><span style="color: rgba(0, 0, 0, 1)">
      mov </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<span style="color: rgba(128, 0, 128, 1)">8</span>],<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">

s:      mov ah, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
      mov al, ;被除数
      div </span><span style="color: rgba(0, 0, 255, 1)">byte</span> ptr ds:[<span style="color: rgba(128, 0, 128, 1)">8</span><span style="color: rgba(0, 0, 0, 1)">]
      call printNumber
      call printSpace

      inc si ;db一个数据一字节,加一
      loop s

      mov ax, 4c00h
      </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

printNumber:
      mov bx, ax
      or bh, 30h ;转为acsii码
      or bl,30h
      mov ah,</span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      mov dl,bl ;低位商
      </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h;
      mov dl,bh ;高位余数
      </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h;
      ret

printSpace:
      mov ah, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      mov dl, </span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(128, 0, 0, 1)">'</span>
      <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h
      ret

code ends
end start</span></pre>
</div>
<p>结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211127165636470-967561566.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>4.实验任务4</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">assume cs:code, ds:data

data segment
      str db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">try</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      len equ $ </span>-<span style="color: rgba(0, 0, 0, 1)"> str
data ends

code segment
start:
      mov ax, data
      mov ds, ax
      mov ax, 0b800h
      mov es, ax ;进入显存

      mov si, offset str;第一个字符偏移地址
      mov cx, len
      mov bl, 2h ;颜色为绿色
      mov bh, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> ;行数为第0行
      call printStr

      mov si, offset str
      mov cx, len
      mov bl, 4h ;颜色为红色
      mov bh, </span><span style="color: rgba(128, 0, 128, 1)">24</span><span style="color: rgba(0, 0, 0, 1)"> ;行数为第24行
      call printStr

      mov ax, 4c00h
      </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

printStr:
      mov al, </span><span style="color: rgba(128, 0, 128, 1)">160</span><span style="color: rgba(0, 0, 0, 1)"> ;一行80字符
      mul bh
      mov di, ax ;ax为第bh行的偏移量,行</span>*<span style="color: rgba(0, 0, 0, 1)">列,从es:di开始输出字符
s:      mov ah, ds:
      mov es:, ah ;字符
      mov es:, bl ;颜色

      add di, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      inc si
      loop s
      ret

code ends
end start</span></pre>
</div>
<p>结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211127172159715-100445700.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>5.实验任务5</p>
<p>代码如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">assume ds:data, cs:code

data segment
    stu_no db </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">201983290125</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    len </span>= $ -<span style="color: rgba(0, 0, 0, 1)"> stu_no
data ends

code segment
start:
      mov ax, data
      mov ds, ax
      mov ax, 0b800h
      mov es, ax
      mov cx, </span><span style="color: rgba(128, 0, 128, 1)">4000</span> ;每一屏字节数:<span style="color: rgba(128, 0, 128, 1)">80</span>×<span style="color: rgba(128, 0, 128, 1)">25</span>×<span style="color: rgba(128, 0, 128, 1)">2</span> =<span style="color: rgba(0, 0, 0, 1)"> 4000字节
      mov di, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
      mov ah,17h ;蓝底白字

s1:    mov al, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
      mov es:, al;低字节字符
      mov es:, ah;高字节颜色、闪烁
      add di, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      loop s1
      ;整个屏幕编程蓝底
      ;最后一行开始的</span>-<span style="color: rgba(0, 0, 0, 1)">
      mov di, </span><span style="color: rgba(128, 0, 128, 1)">3840</span><span style="color: rgba(0, 0, 0, 1)"> ;第24行开始
      mov cx, </span><span style="color: rgba(128, 0, 128, 1)">34</span> ;一行160字节,显示字符串12*<span style="color: rgba(128, 0, 128, 1)">12</span>=24字节,两边136/<span style="color: rgba(128, 0, 128, 1)">4</span>=<span style="color: rgba(128, 0, 128, 1)">34</span>,即2边各打印34个-<span style="color: rgba(0, 0, 0, 1)">
      mov ah, 17h
s2:    call printSign
      add di, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      loop s2

      ;打印学号
      mov di, </span><span style="color: rgba(128, 0, 128, 1)">3908</span><span style="color: rgba(0, 0, 0, 1)"> ;学号开始偏移地址
      mov si, offset stu_no
      mov cx, len;循环次数即学号位数
      mov ah, 17h;蓝底白字
s3:    call printStu
      inc si
      add di, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      loop s3

      ;最后一行最后的</span>-<span style="color: rgba(0, 0, 0, 1)">
      mov di, </span><span style="color: rgba(128, 0, 128, 1)">3932</span> ;=<span style="color: rgba(128, 0, 128, 1)">3840</span>-<span style="color: rgba(128, 0, 128, 1)">68</span><span style="color: rgba(0, 0, 0, 1)">
      mov cx, </span><span style="color: rgba(128, 0, 128, 1)">34</span><span style="color: rgba(0, 0, 0, 1)">
      mov ah, 17h
s4:    call printSign
      add di, </span><span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">
      loop s4

      mov ax, 4c00h
      </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> 21h

printStu:
      mov al, ;学号数字
      mov es:, al
      mov es:, ah
      ret

printSign:
      mov al, 2Dh ;</span>-<span style="color: rgba(0, 0, 0, 1)">
      mov es:, al
      mov es:, ah
      ret

code ends
end start</span></pre>
</div>
<p>&nbsp;</p>
<p>结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211127173950333-311954367.png"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/nuistlyc/p/15606934.html
頁: [1]
查看完整版本: 汇编语言实验三