zoukankan      html  css  js  c++  java
  • 王爽 汇编语言 实验十 课程设计1

    image

    assume cs:code
    
    code segment
    
    data segment
            db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
            db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
            db '1993','1994','1995'
            ;以上是表示21年的字符串 4 * 21 = 84
            dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
            dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
            ;以上是表示21年公司总收入的dword型数据 4 * 21 = 84
            dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
            dw 11542,14430,15257,17800
            ;以上是表示21年公司雇员人数的21个word型数据 2 * 21 = 42
    data ends
    datads segment
            db 100 dup(0)
    datads ends
    start:
            mov bx , data
            mov es , bx
            mov bx , datads
            mov ds , bx
            mov cx , 21
            mov dh , 2
            mov si , 0
            mov bx , 0 ;year
            mov di , 0;income
            mov bp , 0;num
    s:
            ;-----------years----------------------
            mov dl , 3
            mov word ptr ds:[0] , 0;ds:si段使用过的要清零
            mov word ptr ds:[2] , 0
            mov word ptr ds:[4] , 0
            mov ax , es:[bx]
            mov ds:[0] , ax
            mov ax , es:[bx+2]
            mov ds:[2] , ax
            push cx
            mov cx , 4
            call show_str
            pop cx
            ;-----------income---------------------
            add dl , 10
            push dx;dtocex时要使用dx做高位,保护
            mov word ptr ds:[0] , 0
            mov word ptr ds:[2] , 0
            mov word ptr ds:[4] , 0
            mov ax , es:[84+di]
            mov dx , es:[86+di]
            call dtocex
            pop dx
            push cx
            mov cx , 4
            call show_str
            pop cx
            ;-----------num-------------------------
            add dl , 10
            push dx
            mov word ptr ds:[0] , 0
            mov word ptr ds:[2] , 0
            mov word ptr ds:[4] , 0
            mov ax , es:[168+bp]
            call dtoc
            pop dx
            push cx
            mov cx , 4
            call show_str
            pop cx
            ;----------------aver---------------------
            add dl , 10
            push dx
            mov word ptr ds:[0] , 0
            mov word ptr ds:[2] , 0
            mov word ptr ds:[4] , 0
            mov ax , es:[di+84]
            mov dx , es:[di+86]
            div word ptr es:[bp+168]
            call dtoc
            pop dx
            push cx
            mov cx , 4
            call show_str
            pop cx
            ;--------------------------------------
            add bx , 4
            add di , 4
            add bp , 2
            inc dh
    
            dec cx
            cmp cx , 0
            jne s_help
    mov ax , 4c00h
    int 21h
    s_help:
            jmp far ptr s
    
    ;名称:dtocex
    ;功能:将dword型数据转变为表示十进制的字符串,字符串以0为结尾符。
    ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,ds:si指向字符串的首地址
    ;返回:无
    dtocex:
    dataseg_dtocex segment
    db 100 dup(0) ;存放参数和寄存器值
    db 100 dup(0) ;存放结果和中间变量
    dataseg_dtocex ends
    push bx 
    push es
    push di
    push cx
    mov bx , dataseg_dtocex
    mov es , bx
    mov es:[0] , ax
    mov es:[2] , ds
    mov es:[4] , si
    mov es:[6] , dx
    
    mov di , 0
    mov ax , es:[0]
    dtocex_s:
    mov cx , 10
    call divdw;dx:ax / cx = dx:ax~cx
    add cl , 30h
    mov byte ptr es:[100+di] ,cl 
    inc di
    cmp dx , 0
    je dxisz
    jmp dtocex_s
    dxisz:
    cmp ax , 0
    jne dtocex_s
    
    mov cx , di
    mov ds , es:[2]
    mov si , es:[4]
    dtocex_reverse:
    mov bl , es:[99+di]
    mov ds:[si] , bl
    inc si
    dec di
    loop dtocex_reverse
    mov byte ptr ds:[si] , 0
    
    mov ds , es:[2]
    mov si , es:[4]
    pop cx
    pop di
    pop es
    pop bx
    ret
    
    ;名称:divdw
    ;功能:进行不会溢出的除法运算,被除数为dword型,除数为word型,结果为dword型
    ;参数:(ax)=dword型数据的低16位,(dx)=dword型数据的高16位,(cx)=除数
    ;返回:(dx)=结果的高16位,(ax)=结果的低16位,(cx)=余数
    divdw:
    dataseg_divdw segment
    db 100 dup(0) ;存放参数
    db 100 dup(0) ;存放结果和中间变量
    dataseg_divdw ends
    push bx
    push es
    mov bx , dataseg_divdw
    mov es , bx
    mov es:[0] , ax ;L
    mov es:[2] , dx ;H
    mov es:[4] , cx ;N
    
    mov dx , 0
    mov ax , es:[2]
    div word ptr es:[4]
    mov es:[100] , ax   ;结果dx
    mov ax , es:[0]
    div word ptr es:[4]
    mov es:[102] , ax   ;结果ax
    mov es:[104] , dx   ;结果cx
    
    
    mov dx , es:[100]
    mov cx , es:[104]
    pop bx
    pop es
    ret
    
    ;名称:show_str
    ;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
    ;参数:(dh)=行号(取值范围0~24),(dl)=列号(取值范围0~79),(cl)=颜色,ds:si指向字符串的首地址
    ;返回:无
    show_str:
    
    push ax
    push bx
    push cx
    push dx
    push si
    push bp
    push di
    push es
    
    mov al , dh;行号
    add al , 1
    mov bl , 0a0h
    mul bl
    mov dh , 0
    sub dx , 1;
    add dx , dx;因为一个字符占两个字节
    add ax , dx;把dl中的列号加在ax中
    mov di , ax;di放屏幕显示的初始位置
    
    mov ah , cl;ax 要显示的字符和颜色
    mov ch , 0;cx 确定循环的条件
    mov bx , 0b800h
    mov es , bx;es显示的地址
    mov bp , 0;显示地址的游标
    s_showstr:
    mov cl , ds:[si]
    mov al , ds:[si]
    jcxz retseg
    mov es:[di+bp] , ax
    inc si
    add bp , 2
    loop s_showstr
    
    retseg:
    pop es
    pop di
    pop bp
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    ret
    
    ;名称:dtoc
    ;功能:将word型数据转变为表示十进制的字符串,字符串以0为结尾符。
    ;参数:(ax)=word型数据,ds:si指向字符串的首地址
    ;返回:无
    dtoc:
    dataseg_dtoc segment
    db 100 dup(0) ;存放参数和寄存器值
    db 100 dup(0) ;存放结果和中间变量
    dataseg_dtoc ends
    push bx
    push es
    push dx
    push cx
    push di
    mov bx , dataseg_dtoc
    mov es , bx
    mov es:[0] , ax
    mov es:[2] , ds
    mov es:[4] , si
    
    mov bx , 10
    mov di , 0
    mov ax , es:[0]
    dtocs:
    mov dx , 0
    div bx
    mov cx , ax
    add dl , 30h
    mov byte ptr es:[100+di] ,dl 
    inc di
    jcxz getCount
    mov cx , 2 ; 当商为1的时候cx-- , 就为1了,就会跳出循环
    loop dtocs
    
    getCount:
    mov cx , di
    mov ds , es:[2]
    mov si , es:[4]
    dtocreverse:
    mov bl , es:[99+di]
    mov ds:[si] , bl
    inc si
    dec di
    loop dtocreverse
    mov byte ptr ds:[si] , 0
    
    mov ds , es:[2]
    mov si , es:[4]
    pop di 
    pop cx 
    pop dx 
    pop es 
    pop bx
    ret
    
    code ends
    end start
    
  • 相关阅读:
    以您熟悉的编程语言为例完成一个hello/hi的简单的网络聊天程序——网络程序设计课第二次作业
    逆波兰表达式改写(C++)
    侯捷老师的C++代码:基于对象的类别之二带指针的成员函数 Mystring实现
    侯捷老师的C++代码: 基于对象之一 无指针类型 复数类实现
    雇员记录系统(C++)
    设计模式-Interpreter(行为模式) 使用解释器给用户提供一个一门定义语言的语法表示的解释器,通过该解释器解释语言中的句子。
    设计模式-Iterator(行为模式) 将聚合的遍历封装到一个类中
    设计模式-Chain of Responsibility (行为模式) 降低系统的耦合性
    设计模式-Visitor(行为模式) 一个类在不修改自己的同时增加了新的操作,存在问题是 1:破坏了封装性 2:扩展困难
    设计模式-Command(行为模式) 将一个请求封装到一个Command类中,提供一个处理对象Receiver,将Command由Invoker激活。
  • 原文地址:https://www.cnblogs.com/syxchina/p/2197260.html
Copyright © 2011-2022 走看看