汇编语言实验三
<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> </p>
<p>1.</p>
<p> 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> </p>
<p> 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> </p>
<p> 同上,loop指令机器码为E2F0,位移量补码11110000,原码10010000,十进制-16,当前指令读取完毕ip值变为0039,即9+16*3=57,57-16</p>
<p>=41=2*16+9,转化为16进制为0029,即为标号s2处偏移地址。</p>
<p> </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> </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> </p>
<p> 可见执行完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> </p>
<p> 应当进栈的cs:ip为076c:0026,发现bx=0026,ip先出栈,cx=076c,cs再出栈。</p>
<p> </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> </p>
<p> </p>
<p>4.实验任务4</p>
<p> </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> </p>
<p> </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> </p>
<p>结果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/2596764/202111/2596764-20211127173950333-311954367.png"></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/nuistlyc/p/15606934.html
頁:
[1]