• 汇编实验 9 根据材料编程


    实验结论

    1. 补全程序t1.asm,完成在屏幕上输出内存单元中的十进制两位数

    assume cs:code, ds:data
    data segment
    db 12
    db 2 dup(0)      ; 前一个字节用于保存商,后一个字节用于保存余数
    data ends
    code segment
    start:
    mov ax,data
    mov ds,ax        ; 补全指令,使得ds <-- data段地址

    mov ah,0
    mov al,ds:[0]       ; ax <-- data段字节单元的被除数12
    mov bl,10
    div bl
    mov ds:[1],al    ; 补全代码,让商保存到data段注释中指定的单元
    mov ds:[2],ah     ; 补全代码,让余数保存到data段注释中指定的单元

    mov ah,2
    mov dl,ds:[1]       ; 补全代码,使得dl <-- data段中保存的商的字节单元数值
    add dl,30h        ; 补全代码,使得dl中的数值转换为数字字符
    int 21h

    mov ah,2
    mov dl,ds:[2]        ; 补全代码,使得dl <-- data段中保存余数的字节单元数值
    add dl,30h         ; 补全代码,使得dl中的数值转换为数字字符
    int 21h

    mov ax,4c00h
    int 21h
    code ends
    end start

    (这次尝试了一下用masm  for windows软件完成这次实验,确实挺方便的)

    2 dup(0)指的是定义两个数值为0的字节,10是8位,12即保存在ax寄存器中,al存储商,ah存储余数,数值转化为数字字符在前面的实验中有遇见,不再解释。

    实验截图如下

    商为1,余数为2

    2. 补全程序t2.asm,完成在屏幕上输出data段定义的5个十进制两位数,数据和数据 之间以空格间隔。

    assume cs:code, ds:data
    data segment
    db 12,35,96,55,67
    data ends
    code segment
    start:
    mov ax,data        ; 补全程序,参考t1.asm,综合应用以下知识完成:
    mov ds,ax      ; (1) loop指令、内存单元地址的灵活表示
    mov cx,5        ; (2) div指令, 数字→数字字符的转换
    mov si,0         ;(3) int 21h的2号子功能,完成单个字符输出的方法,即:
    s: mov ah,0
    mov al,ds:[si]; mov ah,2
    mov bl,10       ; mov dl,待输出字符或其ASCⅡ码
    div bl
    mov bl,al; int 21h
    mov bh,ah      ;(4) 数据和数据之间以空格间隔的实现: 使用(3)输出空格字符
    mov ah,2
    mov dl,bl
    add dl,30h
    int 21h

    mov ah,2
    mov dl,bh
    add dl,30h
    int 21h

    mov ah,2
    mov dl,32
    int 21h

    inc si
    loop s

    mov ax,4c00h
    int 21h
    code ends
    end start

    这个实验操作流程很简单,就是循环5次,除数是10,每除一次,把商、余数、空格分别输出,循环5次,就ok了。

     

    3. 教材实验9(P187) 

    首先拿到这个问题,先算中间位置,16个字节存字符,16个字节存属性,每行160个字节,80-16=64,64加上行所对应的数值,即是开始位置

    第一行1824,即0720h,第二行1984,即07c0,第三行2144,即0860,

    需要注意的是每次都需要重新赋值bx,cx,si,每次将一个字符放入es中,后面都需要将属性放入后一个字节中。

    ; p187 实验9

    assume ds:data, cs:code
    data segment
    db 'welcome to masm!'
    db 2H,24H,71H    ;字符串属性值
    data ends

    code segment
    start: mov ax,data
    mov ds,ax      ;字符串及属性值所在段的段地址送入ds

    mov ax,0b800H
    mov es,ax      ;80×25彩色字符模式显示缓冲区段地址送入es

    mov cx,16
    mov si,0
    s1: mov ax,ds:[si]
    mov es:[bx+0720h],ax
    mov ax,2h
    mov es:[bx+0721h],ax
    inc si
    add bx,2
    loop s1
    mov bx,0
    mov cx,16
    mov si,0
    s2: mov ax,ds:[si]
    mov es:[bx+07c0h],ax
    mov ax,24h
    mov es:[bx+07c1h],ax
    inc si
    add bx,2
    loop s2
    mov bx,0
    mov cx,16
    mov si,0
    s3: mov ax,ds:[si]
    mov es:[bx+0860h],ax
    mov ax,71h
    mov es:[bx+0861h],ax
    inc si
    add bx,2
    loop s3

    mov ax,4c00h
    int 21h
    code ends
    end start

    优化方向:每一次不用重新将某些寄存器赋值,或许可以通过两重循环,一次循环更改属性,一次循环填入数值。

    实验总结:

    首先这个软件真的挺方便的,用起来很顺手,其次,汇编语言除法的基本语法,比如根据位数来判断放入什么寄存器,都理清楚了,关于最后一个实验,判断位置,填入颜色,循环次数都不能有错,还有程序也可以优化,还需要继续努力。

  • 相关阅读:
    linux死锁检测的一种思路【转】
    2016 最佳 Linux 发行版排行榜【转】
    kernel 3.10内核源码分析--TLB相关--TLB概念、flush、TLB lazy模式 【转】
    spin_lock & mutex_lock的区别? 【转】
    Linux输入子系统:多点触控协议 -- multi-touch-protocol.txt【转】
    Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()【转】
    ARM Linux 3.x的设备树(Device Tree)【转】
    设备树概述【转】
    Tslib的移植【转】
    带你制作百词斩单词表读写插件
  • 原文地址:https://www.cnblogs.com/-Cold/p/10091770.html
Copyright © 2020-2023  润新知