汇编语言课程设计屏幕上设计一个图形,用不同的颜色进行填充

 我来答
匿名用户
2016-01-21
展开全部
结构体定义
;char year[4] // 年
; 空格(1 Byte)
;int income (4 Bytes)// 收入
; 空格
;empoyer num (2 Bytes) // 雇员数
; 空格
;人均收入 (2 Bytes)
; 空格
; 要求:将data段的数据拷贝进table段数据,并结构化如上述格式,然后计算21年的人均收入
assume ds:data, es:table, cs:code, 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
data ends
table segment
db 21 dup ('year summ ne ?? ')
table ends
display segment
db 21 dup ('year summ ne ?? ')
display ends

; 弄个栈,没什么用
; 就用来有时候腾出个寄存器来用
stack segment
dw 16 dup(0)
stack ends
code segment
start:
; 设置data段,以及ds:bx指向data段的第一个单元,即ds:[bx]的内容就是data段第一个单元的内容
mov ax, data
mov ds, ax
; 设置table段
mov ax, table
mov es, ax
; 设置堆栈段
mov ax, stack
mov ss, ax
mov sp, 16
; 初始化三个变址寄存器
mov bx, 0
mov si, 0
mov di, 0
; 准备复制,需要用到循环,21次
mov cx, 21
s_start:
; 年
mov ax, ds:[bx+0] ; 这里写个0是为了下面的对照,清晰点
mov es:[si+0], ax
mov ax, ds:[bx+2]
mov es:[si+2], ax
; 空格
mov al, 32
mov es:[si+4], al
; 收入
mov ax, ds:[bx+84]
mov es:[si+5], ax
mov ax, ds:[bx+86]
mov es:[si+7], ax
; 空格
mov al, 32
mov es:[si+9], al
; 雇员数,小心处理
mov ax, ds:[di+168]
mov es:[si+0ah], ax
; 空格
mov al, 32
mov es:[si+0ch], al
; 算人均收入,这里小心高低位
mov ax, ds:[bx+84]
mov dx, ds:[bx+86]
push cx ; 临时用一下cx,因为不可以 div ds:[bx+168]
mov cx, ds:[di+168]
div word ptr cx
pop cx
mov es:[si+0dh], ax
; 空格
mov al, 32
mov es:[si+0fh], al
add si, 16
add bx, 4
add di, 2 ; 这里记住要加上2
loop s_start
; 上面已经将数据排列好放在table段里,table 段在es:[0] 开始
; 下面就是要读这些数据,并计算好行列,显示在屏幕上
; 结构化的数据按字节排列如下:
; 0123 年(字符) 4 空格(字符) 5678 收入(数据) 9 空格 A B 雇员数(数据) C 空格 D E 人均收入(数据) F 空格
; 总共21年
; 其中收入、雇员数、人均收入是需要转字符格式的
mov ax, display
mov ds, ax
mov si, 0
mov di, 0
mov bx, 0
mov cx, 21
loop_display:
push cx
; #### 年
mov si, 0
mov ax, es:[di]
mov ds:[si], ax
mov ax, es:[di + 2]
mov ds:[si+2], ax
mov ax, 0
mov ds:[si+4], ax ; 原来的显示错误,mov ds:[si+5], ax , 错一个字节都不行。。。
; 显示年
mov dl, 20 ; 第20列
call dis
; #### 收入
mov ax, es:[di+5] ; 低16位
mov dx, es:[di+7] ; 高16位
mov si, 0
call dwtoc ; ds:si 指向字符串首地址
; 显示收入
mov dl, 28 ; 第28列
call dis
; #### 雇员数
mov ax, es:[di+0Ah]
mov si, 0
call dtoc
; 显示雇员数
mov dl, 36 ; 第36列
call dis
; ####人均收入
mov ax, es:[di+0Dh]
mov si, 0
call dtoc
; 显示人均收入
mov dl, 44 ; 第44列
call dis
add di, 16
pop cx
sub cx, 1
jcxz end_main
jmp near ptr loop_display
end_main:
mov ah, 01h
int 21h
mov ax, 4c00h
int 21h
; 子程序dis
; 功能:封装一些相同的操作
; 参数:(dl) 为列数
dis:
push ax
push bx
push cx
push dx
push di
push si
mov ax, di
mov dh, 16
div dh
mov dh, al
add dh, 2 ; dh = di/16+2
mov si, 0
mov cl, 2
call show_str
pop si
pop di
pop dx
pop cx
pop bx
pop ax
ret
; 子程序:dtoc
; 功能:将word型数据转变成表示十进制的字符串,字符串以0结尾
; 参数:(ax) = word 型数据
; ds:si 指向字符串首地址
; 返回:无
dtoc:
博思aippt
2024-07-20 广告
博思AIPPT是基于ai制作PPT的智能在线工具,它提供了4种AI制作PPT的方式,包括AI生成大纲、AI直接生成PPT、文本生成PPT、AI提炼文档生成PPT,一站式集成多种AI生成PPT的方式,可满足办公用户的不同需求和使用场景。ai生... 点击进入详情页
本回答由博思aippt提供
gcbjoy
2016-01-26 · TA获得超过1.1万个赞
知道大有可为答主
回答量:1.1万
采纳率:92%
帮助的人:2186万
展开全部


画矩形框子程序:
fr struc
savebp dw ?
saveret dd ?
y2 dd ?
x2 dd ?
y1 dd ?
x1 dd ?
color dd ?
fr ends
extrn line:far
code segment
assume cs:code
public box
box proc far
push bp
mov bp,sp
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
les bx,[bp].color
push es
push bx
les bx,[bp].x1
push es
push bx
les bx,[bp].y1
push es
push bx
les bx,[bp].x1
push es
push bx
les bx,[bp].y2
push es
push bx
call line
les bx,[bp].color
push es
push bx
les bx,[bp].x1
push es
push bx
les bx,[bp].y2
push es
push bx
les bx,[bp].x2
push es
push bx
les bx,[bp].y2
push es
push bx
call line
les bx,[bp].color
push es
push bx
les bx,[bp].x2
push es
push bx
les bx,[bp].y2
push es
push bx
les bx,[bp].x2
push es
push bx
les bx,[bp].y1
push es
push bx
call line
les bx,[bp].color
push es
push bx
les bx,[bp].x2
push es
push bx
les bx,[bp].y1
push es
push bx
les bx,[bp].x1
push es
push bx
les bx,[bp].y1
push es
push bx
call line
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
pop bp
ret 20
box endp
code ends
end
填充子程序:
tose macro zzzzz
LOCAL L1,L2,L3,L4,L5,L6,NEXT
MOV AX,XX
MOV X0,AX
MOV AX,YY
MOV Y0,AX
MOV DI,Y0
MOV SI,X0
L1: MOV AH,13
MOV DX,DI
MOV CX,SI
INT 10H
CMP AL,OLD_COLOR
JNE L2
INC DI
JMP L1
L2: DEC DI
MOV Y1,DI
MOV DI,Y0
L3: MOV AH,13
MOV DX,DI
MOV CX,SI
INT 10H
CMP AL,OLD_COLOR
JNE L4
DEC DI
JMP L3
L4: INC DI
MOV Y2,DI
MOV DI,Y2
MOV COUNT,0
L5: MOV AH,12
MOV DX,DI
MOV CX,SI
MOV AL,NEW_COLOR
INT 10H
CMP COUNT,1
JE L6
      ZZZZZ CX
MOV AH,13
INT 10H
CMP AL,OLD_COLOR
JNE L6
INC COUNT
MOV Y_SAVE,DI
L6: INC DI
CMP DI,Y1
JLE L5
ZZZZZ SI
MOV AX,Y_SAVE
MOV Y0,AX
MOV DI,Y0
CMP COUNT,0
JE NEXT
JMP L1
NEXT: NOP
ENDM

FR STRUC
SAVEBP DW ?
SAVERET DD ?
Y_AD DD ?
X_AD DD ?
COLOR_AD DD ?
FR ENDS
DATA SEGMENT PUBLIC
XX DW ?
YY  DW ?
X0 DW ?
Y0 DW ?
OLD_COLOR DB ?
NEW_COLOR DB ?
Y1 DW ?
Y2 DW ?
Y_SAVE DW ?
COUNT DW ?
DATA ENDS
DGROUP GROUP DATA
CODE SEGMENT
ASSUME CS:CODE,DS:DGROUP
PUBLIC PAINTT
PAINTT PROC FAR
PUSH BP
MOV BP,SP
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
LES BX,[BP].X_AD
MOV AX,ES:[BX]
MOV XX,AX
LES BX,[BP].Y_AD
; MOV AX,199
; SUB AX,ES:[BX]
mov ax,es:[bx]
MOV YY,AX
LES BX,[BP].COLOR_AD
MOV AL,ES:[BX]
MOV NEW_COLOR,AL
MOV AH,13
MOV DX,YY
MOV CX,XX
INT 10H
MOV OLD_COLOR,AL
TOSE INC
DEC XX
TOSE DEC
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
POP BP
RET 12
PAINTT ENDP
CODE ENDS
END
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式