实验要求:
在屏幕的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