汇编语言(王爽)实验十

实验要求:

在屏幕的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以十进制的形式在屏幕的83列,用绿色显示出来。

数据写入:

逆序存放:

逆序存放的代码:

我有点疑惑,为什么逆序之后竟然多了一个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
原文地址:https://www.cnblogs.com/zhenzhenhuang/p/6891499.html