- [assumechen] 呵呵,我把程序搞复杂了。谢谢! 07/12 23:58
- [fpamc] MOV BX,AX MOV AX,DX MOV DX,0 07/11 23:26
- [assumechen] 这个公式原来一直想不明白,总是觉得会溢出,直到看到这个贴子才转过来。 http://www.asm 07/11 21:19
- [assumechen] 谢谢! 07/11 21:16
- [fpamc] 对的。 07/09 23:04
- [assumechen] 谢谢 06/30 22:34
- [assumechen] 谢谢 06/30 22:33
- [fpamc] 对的。 06/30 10:26
- [fpamc] 恩对的, 06/30 10:24
- [assumechen] 是程序错了,把这一句: mov word ptr es:[0dH],ax ; 雇员的平 06/29 14:45
[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
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) |
类型(汇编作业) |
收藏此文 |