汇编语言 课程设计1
本帖最后由 sdnyzjzx 于 2010-12-29 14:56 编辑第一个比较大点的代码,贴出来请大家指正。
由于一开始写每个模块时,并不知道这个课程设计要求,也不懂编程的原则,所以开始设计的每个小模块都只照顾到了自己的功能,没有考虑到其他模块间的调用,加上不知道编程的原则(我认为至少要做好寄存器数据保护与还原),因此整个代码还不是很条理,甚至有点乱,也给后来合并到一起时的调试带来了很多麻烦,尽管如此,从中学到不处东西:1、了解了栈平衡的重要性;2、了解了编制一段大点代码要统筹安排,合理分配寄存器的使用,到底想要怎么传递参数,心里一定要清楚;3、练习了数据的寻址方式。
尽管不算好,但功能实现了,还是贴出来记录一下,今后再进一步改进。assume cs:code
data segment
dw 100 dup (0)
idw 1423,12666,1,8,3,38
jdd 1024,1234567,238763,887766,345543,99990088
d_1 db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
d_2dd 16,22,382,1356,2390,8000,160000,24486,50065,97479,140417,197514
dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
d_3dw 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
stack segment
dw 100 dup (0)
stack ends
code segment
start:mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,200
mov ax,table
mov es,ax
mov bx,offset d_1 ;年份入栈
mov cx,21
s1:
mov ax,
push ax
mov ax,
push ax
add bx,4
loop s1
mov bx,140h
mov cx,15h
s2: pop ax ;年份出栈到 table 表
mov es:,ax
pop dx
mov es:,dx
sub bx,10h
loop s2
mov bx,offset d_2
mov cx,21
s3: mov ax, ;收入入栈
push ax
mov ax,
push ax
add bx,4
loop s3
mov bx,140h
mov cx,15h
s4: pop ax ;收入出栈到 table 表
mov es:,ax
pop dx
mov es:,dx
sub bx,10h
loop s4
mov bx,offset d_3 ;雇员人数
mov cx,21
mov si,0
s5: mov ax,
push si
shl si,1
shl si,1
shl si,1
shl si,1
mov es:,ax
add bx,2
pop si
inc si
loop s5
mov cx,21 ;计算人均收入
mov bx,0
s6: mov dx,es:
mov ax,es:
div word ptr es:
mov es:,ax
add bx,10h
loop s6
; 以上获得 table 表数据
; 以下是显示部分
mov bx,0 ;要显示数据的偏移位置
mov si,0 ;保存数据转化为字符后偏移位置
mov di,0
mov cx,21 ;要转化数据的个数 21行
push cx
_main:
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示年份
call _printable
add sp,2
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示收入
mov ax,es: ;转化收入为字符
mov dx,es:
push cx
mov cx,0ah
call dtoc
pop cx
push bx
mov bx,386 ;3行33列
call show_str
pop bx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示雇员数
mov ax,es: ;转化收入为字符
mov dx,0
push cx
mov cx,0ah
call dtoc
pop cx
push bx
mov bx,410 ;3行45列
call show_str
pop bx
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;显示人均收入
mov ax,es: ;转化收入为字符
mov dx,0
push cx
mov cx,0ah
call dtoc
pop cx
push bx
mov bx,434 ;3行57列
call show_str
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;循环显示21行
add di,160
pop bx ;行加1
add bx,10h
loop _main
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;退出程序
mov ax,4c00h
int 21h
_printable:
push bp
mov bp,sp
push cx
push bx
push si
push es
push ax
xor ax,ax
mov al,02h ;显示首行
mov cx,80*2
mul cx
xor dx,dx
mov dl,18h ;显示首列
add dl,dl
add ax,dx
add ax,di
mov si,ax
mov cx,5
_s_show:
mov al,es: ;显示 1-5 位字符
push bx
push es
mov bx,0b800h
mov es,bx
mov es:,al
mov es:,byte ptr 4 ;字符颜色
pop es
pop bx
inc bx
inc si
inc si
loop _s_show
_s_over:
pop ax
pop es
pop si
pop bx
pop cx
mov sp,bp
pop bp
ret
dtoc: push bx
_s0: call divdw
cmp dx,0 ;商的高位是否为0
jnz _s1
cmp ax,0 ;商的低位是否为0
jnz _s1
add cx,30h
mov ,cx
pop bx
ret ;数据转化完成,返回
_s1: ; 写入转化完成的数据为字符
add cx,30h
mov ,cx
inc si
mov cx,0ah
jmp _s0
show_str:
push es
mov ax,0b800h
mov es,ax
xianshi: ;dtoc 显示
mov al,
mov byte ptr es:,al ;要显示的字符
mov byte ptr es:,4 ;要显示字符的颜色
cmp si,0
jz ok
dec si
add bx,2
jmp xianshi
ok: pop es
ret
divdw: push si ;dword型数值除法运算
push di
mov si,ax ;save ax(L)t
mov ax,dx
mov dx,0
div cx ;(H/N)
mov di,dx ;save rem(H/N)
push di
mov dx,0 ;int(H/N)
mov di,2
mul di
mov bx,32768 ;int(H/N)*65536
mul bx
pop di
push ax ;save int(H/N)*65536
push dx
mov ax,di ;Load rem(H/N)
mov di,2
mul di
mul bx
add ax,si ;rem(H/N)*65536+L
div cx
mov si,ax
mov cx,dx
pop dx
pop ax
pop di
add ax,si
pop si
ret
code ends
end start
很给力 good job ~ 不错,有前途啊,写的很好 太强大了……
在看第八章…… 学好汇编不容易,大学时学过,不过早忘了./:011 好厉害,俺考核终于结束了有时间了争取追上大家 收藏,慢慢研究 汇编看不懂哦~~~
页:
[1]