zoukankan      html  css  js  c++  java
  • 汇编语言(王爽)实验十

    实验要求:

    在屏幕的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
  • 相关阅读:
    2-字符串篇(4)
    1-数组篇(2)
    Neo4j-电影图(演员与电影之间的流行文化联系)
    NLP(相关资料)
    Oracle中的rank()函数使用
    PostgreSQL入门
    风格迁移论文理解--A Neural Algorithm of Artistic Style
    【Math】复数表示和傅里叶变换
    github资源使用--程序员必备
    【TF-2-3】Tensorflow-可视化(TensorBoard)
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/6891499.html
Copyright © 2011-2022 走看看