【汇编语言】课程设计1---------------by.龙猫
2018-02-12 17:55
141 查看
assume cs:code, ds:data, ss:stack 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' dd 16, 22, 382, 1356, 2390, 8000, 16000, 24486, 50065, 97479, 140417, 197514 dd 345980, 590827, 803530, 1183000, 1843000, 2759000, 3753000, 4649000, 5937000 dw 3, 7, 9, 13, 28, 38, 130, 220, 476, 778, 1001, 1442, 2258, 2793, 4037, 5635, 8226 dw 11542, 14430, 15257, 17800 db 16 dup(0) ;用来存放临时转换显示的数据 data ends stack segment db 16 dup(0) db 16 dup(0) db 16 dup(0) db 16 dup(0) stack ends code segment start: mov ax, data mov ds, ax ;设置数据段 mov ax, stack mov ss, ax mov sp, 64 ;设置栈段 mov ax, 0b800h mov es, ax ;设置显存段地址 mov bx, 280h ;显存结构化数组偏移地址 mov si, 0 ;源数据偏移地址,si关联data段 mov di, 0 ;目标数组偏移地址 mov dl, 2 ;字符颜色属性 mov cx, 21 s0: push cx ;把cx的值保护起来 push di mov cx, 4 ;循环4次完成年份的显示 s1: mov al, 0[si] ;si是源数据的偏移 mov es:[bx+di], al ;存放颜色属性到显存 mov es:[bx+di+1], dl ;存放字符到显存 inc si ;源数据偏移+1 add di, 2 ;一个字符的占用2个字节 loop s1 ;循环4次完成年份的显示 pop di pop cx ;还原cx的值 add bx, 160 ;跳到下一行显示 loop s0 ;完成"年份"的显示 一共21年 mov bx, 2d0h ;显存结构化数组偏移地址 mov si, 0d2h ;源数据偏移地址 这个段存放的是员工的数量 mov di, 0 ;目标数组偏移地址 mov cx, 21 s2: mov ax, 168[di] call dtoc call show_str add di, 2 ;员工数量的数据为dword型 所以+2 add bx, 160 ;换行 loop s2 ;完成员工人数的显示 一共21年 mov bx, 2f8h ;显存结构化数组偏移地址 mov si, 0d2h ;源数据偏移地址 mov di, 0 ;目标数组偏移地址 mov bp, 0 ;源数据员工数量的偏移 mov cx, 21 s9: push cx mov ax, 84[di] ;总收入存放低16位 mov dx, 86[di] ;总收入存放高16位置 mov cx, ds:168[bp] ;员工数量赋给cx div cx ;完成除法后商存储在ax中 call dtoc ;对ax的数值进行int转char push bp ;把bp的值保护起来 call show_str pop bp ;还原bp add di, 4 add bp, 2 ;员工数量占用2个字节所以地址+2 add bx, 160 ;换行 pop cx loop s9 ;完成人均收入的显示 mov bx, 2a8h ;显存结构化数组偏移地址 mov si, 0d2h ;源数据偏移地址 mov di, 0 ;目标数组偏移地址 mov cx, 21 s10: push cx push bx mov bx, 0 mov ax, 84[di] ;收入低16位 mov dx, 86[di] ;收入高16位 s99: call divdw ;dx为高16商,ax为低16商,cx为余数 push cx ;余数压栈 mov cx, dx ;高16位商赋给cx jcxz yes ;如果高16商为0则跳转 pop cx ;取出余数 add cx, 30h ;int转char push cx ;char压栈 inc bx ;计数器功能 jmp short s99 yes: mov cx, ax ;ax为低16商赋给cx jcxz yes1 ;如果低16位为0则跳到yes1 pop cx ;取出上一次的余数 add cx, 30h ;int转char push cx ;char压栈 inc bx ;计数器功能 jmp short s99 yes1: pop cx ;取出最后一位的余数 add cx, 30h ;int转char push cx ;char压栈 inc bx ;计数器功能 nop nop mov cx, bx ;计数器的数值为循环次数 s11: pop ax ;取出char mov [si], al ;赋给data段 inc si ;源数据偏移地址+1 loop s11 ;进行循环,实现字符串的正序排放 mov al, 0 ;字符串结尾0 mov [si], al ;写到data段 mov si, 0d2h ;再次将si指向字符串开始,为显示作准备 pop bx ;显存结构化数组偏移地址 pop cx ;外层循环次数 21年共21次 call show_str ;显示 add bx, 160 ;换行 add di, 4 ;收入的数据偏移 因为是dword类型,所以+4 loop s10 ;完成总收入的显示 mov ax, 4c00h int 21h dtoc: push cx push bx ;显存结构化数组偏移地址 mov bx, 0 ;此bx作为计数器 s8: ;把int转为char推入栈中 mov dx, 0 mov cx, 0ah div cx mov cx, ax jcxz ok add dx, 30h inc bx push dx jmp short s8 ok: ;完成最后一位int的char推入 add dx, 30h push dx inc bx mov cx, bx s3: ;从栈中取出字符串,完成正序现实 pop ax mov [si], al inc si loop s3 mov al, 0 mov [si], al ;写入0代表字符串的结束 mov si, 0d2h ;再次将si指向字符串开始,为显示作准备 pop bx pop cx ret show_str: push cx push bx mov bp, bx mov cl, 2 mov bl, cl ;将cl中的内容保护起来 s4: mov cl, [si] mov ch, 0 ;cx高位置0 jcxz ok1 ;cx为0则表示字符串的结尾 mov es:[bp], cl ;写入字符 mov es:[bp+1], bl ;写入字符颜色属性 inc si ;源字符串偏移+1 add bp, 2 ;写入显存的bp偏移+2 jmp short s4 ok1: mov si, 0d2h ;再次将si指向字符串开始,为下个循环存储作准备 pop bx pop cx ret ;mov ax, 84[di] 收入低16位 ;mov dx, 86[di] 收入高16位 divdw: push bx ;下面要动用到dx所以把bx保存起来 mov cx, 0ah ;cx=10 push ax ;原本被除低16位数压栈 mov ax, dx ;被除数高16位赋给ax,ax作为被除数的低16位 mov dx, 0 ;被除数高16位置0 div cx ;ax存商,dx存余数 mov bx, ax ;bx中存放高16位 pop ax ;被除数低16位 div cx ;ax存商,dx存余数 mov cx, dx ;cx中存放余数 mov dx, bx ;高16位放回dx中 pop bx ;还原bx ret code ends end start
相关文章推荐
- 8086汇编学习小记-王爽汇编语言课程实验15及课程设计2的DOS环境
- 汇编语言王爽课程设计二
- 汇编语言:课程设计1
- 王爽 -- 汇编语言课程设计2一些问题记录
- 王爽汇编语言课程设计一
- 王爽汇编语言课程设计2
- 王爽汇编语言课程设计2
- 王爽汇编语言课程设计2
- 汇编语言-王爽-课程设计1
- 汇编语言(王爽) 课程设计1
- 王爽汇编语言课程设计1
- 汇编语言(王爽)--课程设计一
- 王爽 汇编语言 课程设计1
- 急求解:汇编语言课程设计
- 学习<<汇编语言 -王爽>>,自已完成的一道课程设计题 (5)
- ***汇编语言 课程设计1 格式化输出公司数据
- 王爽-汇编语言 课程设计1 汇编源代码
- 汇编语言-课程设计一
- 王爽汇编语言课程设计1
- 王爽汇编语言课程设计1