汇编语言(王爽)实验十
Posted 天气晚来秋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言(王爽)实验十相关的知识,希望对你有一定的参考价值。
实验要求:
在屏幕的8行3列,用绿色显示data段中的字符串。
data段的数据: ‘welcome to masm!’,0
实验分析:
建立在实验九的基础上。
定位:8行3列。
输出:只能输出welcome to masm!
寄存器太多,不能重用。
解决第一个问题:di为屏幕上的位置。dh存的行,dl存的是列
解决第二个问题:loop循环退出的条件是cx寄存器为0
把data段传入cx。如果是0。退出。
1 assume cs:code 2 data segment 3 db \'Welcome to masm!\',0 4 data ends 5 6 code segment 7 start: 8 mov dh,8 9 mov dl,3 10 mov cl,2 11 mov ax,data 12 mov ds,ax 13 mov si,0 14 call show_str 15 16 mov ax,4c00h 17 int 21h 18 show_str: 19 mov bx,cx 20 21 mov ax,data 22 mov ds,ax 23 24 mov ax,0b800h 25 mov es,ax 26 27 mov al,160 28 mul dh 29 30 add dl,dl 31 mov cl,dl 32 mov ch,0 33 34 add ax,cx 35 mov di,ax 36 37 38 s: 39 mov ch,0 40 mov cl,ds:[si] 41 jcxz brk 42 mov al,ds:[si] 43 mov ah,bl 44 mov es:[di],ax 45 inc di 46 inc di 47 inc si 48 loop s 49 50 51 brk: 52 ret 53 54 code ends 55 end start
实验虽然很简单。但是我做了一个小时。
我爱学习!我不爱玩狼人杀
-----分割线-----上文编辑于----------
------------------------------------------------------------
2.解决除法溢出的问题
实验要求:
进行不会溢出的乘法运算。举例:F4240H/0AH。
实验设计:
①将高16位先除除数0AH。商和余数压入栈中。
②取出余数,将余数先乘16^3,除0AH。将商压入栈中。将余数乘16,除0AH,将商压入栈中。
为何要这样处理?因为无法直接将高十六位的余数乘以16^4,会溢出。所以分两步处理。
③将第二步的余数与低十六位相加。与0AH进行运算。得到商和余数。
但是第三步有欠妥当的地方。不知道低十六位加上第二步的余数是否会溢出。在本例中不会溢出。实际上应慎重处理。
第三步余数就是最终结果的余数。
④把压入栈的商都一一取出。恢复进制。
assume cs:code code segment start: mov ax,4240h mov dx,000fh mov cx,0ah call divw mov ax,4c00h int 21h divw: mov bx,ax mov ax,dx mov dx,0 div cx push ax push cx push dx pop ax mov cx,3 s: mov di,16 mul di loop s pop cx div cx push ax push dx pop ax mov di,16 mul di div cx push ax mov ax,bx add ax,dx mov dx,0 div cx mov cx,dx mov bx,ax pop ax add bx,ax pop ax mov di,16 mul di add ax,bx pop dx ret code ends end start
实验结果:
除法运算 |
AX |
DX |
第1次 |
0001H |
0005H |
第2次 |
0800H |
0000H |
第3次 |
0000H |
0000H |
第4次 |
06a0H |
0000H |
最后的结果:
AX=86A0H
DX=0001H
CX=0000H
3.数据显示
实验要求:
编程,将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。
数据写入:
逆序存放:
逆序存放的代码:
我有点疑惑,为什么逆序之后竟然多了一个6?
我假装没有看到这个小bug。
结果导向,实验输出符合要求。
assume cs:code data segment db 10 dup(0) data ends code segment start: mov ax,12666 mov bx,data mov ds,bx mov si,0 call dtoc mov dh,8 mov dl,3 mov cl,2 call show_str mov ax,4c00h dtoc: mov cx,ax mov si,0 mov bx,10 mov dx,0 s: div bx add dx,30H mov ds:[si],dx inc si mov cx,ax mov dx,0 inc cx loop s mov cx,si mov si,0 psh: mov ax,ds:[si] push ax inc si loop psh mov cx,si mov si,0 pp: pop ax mov ds:[si],ax inc si loop pp ret show_str: mov bx,cx mov ax,0b800h mov es,ax mov al,160 mul dh add dl,dl mov cl,dl mov ch,0 add ax,cx mov di,ax mov cx,si mov si,0 s1: mov al,ds:[si] mov ah,bl mov es:[di],ax inc di inc di inc si loop s1 ret code ends end start
以上是关于汇编语言(王爽)实验十的主要内容,如果未能解决你的问题,请参考以下文章