最近突然想系统的学学汇编,看网上推荐王爽老师的《汇编语言》这本书不错,遂在网上DOWN了一本,刚开始看前几章内容看的挺快,挺简单,慢慢的速度就慢了下来,主要是书上有一些课后题需要做,根据学习的进度,课后题越来越复杂,用到的知识也越来越综合(我是把课后题都做了一遍);昨天学完了第十章,后面有个课程设计一,看着就挺复杂,难倒是不难,就是用到的东西比较多:
题目如下:
正好今天是周六,闲来无事,决定搞定它,经过一番痛苦的分析及调试之后,终于出现了题目要求的效果:
汇编这玩意编个小程序还能玩玩,编个稍微大点的,折磨死人啊,下面贴一下代码:(masm编译)
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,2795000,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 dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239 dw 260,304,333 dd 16 dup (0) data ends stack segment dw 64 dup (0) stack ends code segment main: mov ax,data mov ds,ax mov ax,stack mov ss,ax mov sp,80h mov ax,0b800h mov es,ax mov di,168 mov cx,21 mov dl,3 ;行 mov dh,20 mov di,168 mov bp,0 main_s: push dx push cx mov cl,24h mov si,bp mov ch,4 call show_str add si,84 mov ax,[si] push dx mov dx,[si].2 call dtoc pop dx mov ch,7 mov cl,24h mov dh,30 call show_str mov si,di mov ax,[si] push dx mov dx,0 call dtoc pop dx mov ch,5 mov cl,24h mov dh,43 call show_str mov si,di add si,42 mov ax,[si] push dx mov dx,0 call dtoc pop dx mov ch,3 mov cl,24h mov dh,55 call show_str add di,2 add bp,4 pop cx pop dx inc dx loop main_s mov ax,4c00h int 21h dtoc: push bx push cx mov si,260 dtoc_s: mov cx,10 call divdw add cx,30h mov [si],cl mov cx,ax jcxz dtoc_tmp dtoc_con: dec si jmp short dtoc_s dtoc_tmp: mov cx,dx jcxz dtoc_ok jmp short dtoc_con dtoc_ok: pop cx pop bx ret divdw: push bx push si mov bx,ax mov ax,dx mov dx,0 div cx mov si,ax mov ax,bx div cx mov cx,dx mov dx,si pop si pop bx ret show_str: ; dl,行 dh,列 cl,颜色 si,数据地址 ch,数据个数 push ax push di push bx push si push cx mov di,0 mov al,dl mov bl,160 mul bl mov bx,ax mov al,dh mov ch,2 mul ch add bx,ax pop cx mov ah,cl mov cl,ch mov ch,0 show_str_s: mov al,ds:[si] mov es:[bx+di],ax add di,2 inc si loop show_str_s pop si pop bx pop di pop ax ret code ends end main