汇编网首页登录博客注册
assumechen的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
最新留言
好友圈
文章收藏
友情链接

[2019-03-31 17:13] 课程设计1

图片载入中
assume cs:code, ds:data, ss:stack

data segment 
    db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982'
    db '1983', '1984', '1985', '1986', '1987', '1988', '1989', '1990'
    db '1991', '1992', '1993', '1994', '1995' 
    ; 以上表示21个年份的字符串 0 - 83 
         
    dd 16,22,382,1356,2390,8000,16000,24486
    dd 50065,97479,140417,197514,345980,590827,803530,1183000
    dd 1184000,2759000,3753000,4649000,5937000 
    ; 以上表示21个公司的收入状况   84 - 167 
         
    dw 3,7,9,13,28,38,130,220
    dw 476,778,1001,1442,2258,2793,4037,5635
    dw 8226,11542,14430,15257,17800 
    ; 以上表示21年公司雇员人数  168 - 209 
data ends 

table segment 
    db 32*21  dup (' ') 
table ends 

stack segment
    db 64 dup(0)
stack ends

code segment 

; 说明:divdw - 进行不会溢出的除法运算
; 参数: (ax)=dword型数据的低16位
;       (dx)=dword型数据的高16位 
;       (cx)=cx为除数
; 结果: (dx)=结果的高16位,(ax)=结果的低16位, (cx)=余数
divdw:
    push bx
    push si

    ; 保存被除数低16位
    mov bx, ax
    ; 高16位进行32除法  
    mov ax, dx
    sub dx, dx
    div cx
    ; 暂存高位除法的商 
    mov si, ax
    ; 高位除法余数加上低16位后进行32位除法
    mov ax, bx
    div cx
    mov cx, dx
    mov dx, si

    pop si
    pop bx
    ret

; 说明: 计算字符串长度
; 参数:ds:si指向字符串的首地址
; 结果: ax=字符串的长度
strlen: 
    push bx
    push cx
    push si
    mov cx, 0
    mov ax, 0
lo_str:
    mov cl, ds:[si]
    cmp cl, 0
    jcxz result
    inc si
    inc ax
    loop lo_str
result:
    pop si
    pop cx
    pop bx
    ret 

; 说明: 格式化字符串为指定长度,不足时填充空格, 超出时直接返回
; 参数: ds:si指向字符串的首地址
;       ch: 需要格式化的长度, cl:字符串的长度
; 结果: 无
format:
    push si
    push ax
    cmp ch, cl
    jb format_end
    je format_end   
    mov ax, cx
    mov ch, 0
    add si, cx
    sub ah, al
    mov cl, ah
format_lo:
    mov byte ptr [si], ' '
    inc si
    loop format_lo
    mov byte ptr [si], 0
format_end:
    pop ax
    pop si
    ret

; 说明:show_str - 显示字符串
; 参数: (dh)=行号,(dl)=列号,(cl)=颜色, ds:si指向字符串首地址
; 结果: void
show_str:
    push ax
    push es
    push di
    push si

    mov ax, 0b800h
    mov es, ax

    mov al, 160
    mov ah, dh
    call b_mul 
    mov di, ax

    mov ah, 2
    mov al, dl
    call b_mul
    add di, ax

    mov al, cl
    mov ch, 0
str:
    mov cl, ds:[si]
    inc si
    cmp cl, 10
    je show_lf
    jcxz ok
    mov es:[di], cl
    mov es:[di+1], al
    add di, 2
    loop str
show_lf:
    inc dh
    mov al, 160
    mov ah, dh
    call b_mul 
    mov di, ax

    mov ah, 2
    mov al, dl
    call b_mul
    add di, ax
    loop str
ok:
    pop si
    pop di
    pop es
    pop ax
    ret

; 名称: ddtoc
; 功能 将dword型数据转变为表示十进制的字符串,字符串以0为结尾符
; 参数: (dx)=高16位word型数据
;       (ax)=低16位word型数据
;       ds:si指向字符串的首地址
ddtoc:   
    push bx
    push cx
    push di
    push bp
    push si

    mov bp, 0ffffH
    push bp 
s_dtoc:
    mov cx, 10
    call divdw
    push cx
    mov cx, dx
    jcxz hok_dtoc 
    inc cx
    loop s_dtoc
hok_dtoc:
    mov cx, ax
    jcxz ok_dtoc    
    inc cx
    loop s_dtoc
ok_dtoc:
    pop cx
    cmp cx, 0ffffH
    je exit_dtoc
    add cx, 30h
    mov [si], cl
    inc si
    loop ok_dtoc
exit_dtoc:
    mov byte ptr [si], 0
    pop si
    pop bp
    pop di
    pop cx
    pop bx
    ret

; 说明:b_mul - 字节数相乘
; 参数: (al)=乘数 (ah)=乘数
; 结果: (ax)=(al)*(ah)
b_mul:
    mul ah
    ret

start:
    mov ax, stack
    mov ss, ax
    mov sp, 40H;

    mov ax,data 
    mov ds,ax        ; 设置数据段地址 
       
    mov ax,table 
    mov es,ax        ; 设置表格段地址 

    mov si,4         ; 设置4的比例因子
    mov bx,2         ; 设置2的比例因子
    mov di,32        ; 设置16的比例因子 
    mov cx,0         ; 通过cmp cx, 21的条件跳转来实现循环21次  
s:          
    push cx
    push bx
    push si
    push di

    mov ax, bx
    mov ah, cl
    call b_mul
    mov bx, ax

    mov ax, si
    mov ah, cl
    call b_mul
    mov si, ax

    mov ax, di
    mov ah, cl
    call b_mul
    mov di, ax

    mov ax, ds:[si] 
    mov es:[di], ax 
    mov ax, ds:2[si] 
    mov es: 2[di], ax             ; year 
    
    mov byte ptr es:4[di], ' '   
    mov byte ptr es:5[di], ' '   

    push ds
    push si
    push cx
    
    ; 收入
    ; 名称: ddtoc
    ; 功能 将dword型数据转变为表示十进制的字符串,字符串以0为结尾符
    ; 参数: (dx)=高16位word型数据
    ;       (ax)=低16位word型数据
    ;       ds:si指向字符串的首地址
    mov ax, 84[si]
    mov dx, 86[si]
    push dx    ; 计算人均收入时的被除数
    push ax
    mov cx, 168[bx]
    push cx

    mov si, es
    mov ds, si     
    mov si, di 
    add si, 6
    call ddtoc
; 说明: 计算字符串长度
; 参数:ds:si指向字符串的首地址
; 结果: ax=字符串的长度
    call strlen
    mov cl, al
    mov ch, 10
; 说明: 格式化字符串为指定长度,不足时填充空格, 超出时直接返回
; 参数: ds:si指向字符串的首地址
;       ch: 需要格式化的长度, cl:字符串的长度
; 结果: 无
    call format
    mov byte ptr es:16[di], ' '  

    ; 人数
    mov si, di
    add si, 17
    mov dx, 0
    pop ax   ; 计算人均收入时的除数
    push ax
    call ddtoc
    call strlen
    mov cl, al
    mov ch, 10
    call format
    mov byte ptr es:22[di], ' '
; 说明:divdw - 进行不会溢出的除法运算
; 参数: (ax)=dword型数据的低16位
;       (dx)=dword型数据的高16位 
;       (cx)=cx为除数
; 结果: (dx)=结果的高16位,(ax)=结果的低16位, (cx)=余数
    pop cx
    pop ax
    pop dx
    call divdw
    mov si, di 
    add si, 23
    call ddtoc
    call strlen
    mov cl, al
    mov ch, 9
    call format
    add si, 8
    mov byte ptr es:[si], 10

    pop cx
    pop si
    pop ds

    pop di
    pop si
    pop bx
    pop cx

    inc cx        
    cmp cx, 21
    je exit_start
    ja exit_start
    jmp near ptr s
exit_start:
    ; 说明:show_str - 显示字符串
    ; 参数: (dh)=行号,(dl)=列号,(cl)=颜色, ds:si指向字符串首地址
    ; 结果: void
    mov dh, 2
    mov dl, 1
    mov cl, 01000010B
    mov si, es
    mov ds, si
    sub si, si
    call show_str

    mov ax,4c00H 
    int 21H 
code ends 

end start
评论次数(0)  |  浏览次数(355)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码