汇编语言课程设计一

        课程设计一废了很大劲才搞定,我自己写了很久都没搞定于是参考了其他人的一些代码,然后把其中一些部分换成自己的
参考资料:http://blog.csdn.net/zhangyuzuishuai/article/details/52274104
如需转载请注明链接:http://mp.blog.csdn.net/postedit
实验结果如下

assume cs:code,ss:stack,ds:data
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'  
    ;表示21年的21个字符串  
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514  
    dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000  
    ;表示21年公司总收入的dword型数据  
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226  
    dw 11542,14430,15257,17800  
    ;表示21年公司雇员人数的21个word型数据  
data ends  
stack segment  
    db 20 dup (0)  
stack ends  
string segment  
    db 21 dup ('1970      0         0         0        ',0);这里是40个字节一行  
string ends  
code segment  
main:    
    mov ax,stack  
    mov ss,ax  
    mov sp,32;指针指向栈空间  
    mov ax,data  
    mov ds,ax  
    mov bx,0  
    mov di,0  
    mov ax,string  
    mov es,ax  
    mov si,0;指向数据空间  
    mov cx,21  
    s0:    
        push cx  
        mov ax,[bx+0]  
        mov es:[si],ax  
        add si,2  
        mov ax,[bx+2]  
        mov es:[si],ax;写入年份  
        add si,2  
        add si,6;6字节不写  
        mov ax,[bx+54H]  
        mov dx,[bx+54H+2]  
        call dtocdw;总收入10进制转换成字符串并写入  
        add si,10  
        mov ax,[di+0A8H]  
        call dtoc;雇员人数10进制转换成字符串并写入  
        add si,10  
        mov ax,[bx+54H+0]  
        mov dx,[bx+54H+2]  
        mov cx,[di+0A8H];这里改变了cx,记得用后还原  
        call divdw;得到人均收入,(dx)=高16位,(ax)=低16位  
        call dtocdw;人均收入10进制转换成字符串并写入  
        add si,10;有一个0作为结束标记,占1字节,其余9个空格,初始化时定义  
        add bx,4  
        add di,2  
        pop cx  
        loop s0  
    mov dh,4;更完善的可以之前做一下清屏工作     
    mov ax,string  
    mov ds,ax  
    mov bx,0  
    mov cx,21  
    s1:  
        push cx;这里改变了cx,记得用后还原  
        mov dl,3  
        mov cl,00000010B  
        call print;调用show_str子程序,显示一行数据  
        inc dh  
        inc bx  
        pop cx  
        loop s1  
    ;mov ah,0  
    ;int 16H;按任意键继续,可直接双击运行  
    mov ax,4C00H  
    int 21H  
;名称:dtoc  
;功能:将十进制数据转化为字符串  
;参数:(ax)是十进制数据,ss:[sp]指向stack栈底,es:[si]指向string当前  
;返回:在string标号内存空间的字符串,si不变  
dtoc:     
    push ax  
    push bx  
    push cx  
    push dx  
    push es  
    mov bx,0  
    numToChar:    
        mov dx,0  
        mov cx,10  
        div cx  
        add dx,30H  
        push dx  
        inc bx;(bx)代表栈中有几个字符  
        mov cx,ax;商为0代表数字处理结束  
        jcxz stackToString  
        jmp short numToChar  
    stackToString:    
        mov cx,bx  
        mov bx,0  
    dtocS1:   
        pop ax  
        mov es:[bx+si],al;一次取一个字  
        inc bx  
        loop dtocS1  
    dtocOk:   
        pop es  
        pop dx  
        pop cx  
        pop bx  
        pop ax;注意按原本顺序倒序出栈  
        ret  
;名称:dtocdw  
;功能:将dword型十进制数据转化为字符串  
;参数:(ax)是dword型十进制数据低16位,(dx)是dword型十进制数据高16位,es:[si]指向string当前  
;返回:在string标号内存空间的字符串,si不变  
dtocdw:   
    push ax  
    push bx  
    push cx  
    push dx  
    push es  
    mov bx,0  
    numToCharDw:    
        mov cx,10  
        call divdw;被除数在dx和ax中,余数在cx中  
        add cx,30H  
        push cx  
        inc bx;(bx)代表栈中有几个字符  
        mov cx,dx  
        or cx,ax;商为0代表数字处理结束  
        jcxz stackToStringDw  
        jmp short numToCharDw  
    stackToStringDw:    
        mov cx,bx  
        mov bx,0  
    dtocdwS1:   
        pop ax  
        mov es:[bx+si],al;一次取一个字  
        inc bx  
        loop dtocdwS1  
    dtocdwOk:   
        pop es  
        pop dx  
        pop cx  
        pop bx  
        pop ax;注意按原本顺序倒序出栈  
        ret  
;名称:divdw  
;功能:除法,被除数32位,除数16位,商32位,余数16位,不会溢出  
;参数:(dx)=被除数的高16位,(ax)=被除数的低16位,(cx)=除数  
;返回:(dx)=商的高16位,(ax)=商的低16位,(cx)=余数  
divdw:    
    push bx  
    push ax  
    mov ax,dx;(ax)=000FH  
    mov dx,0;(dx)=0  
    div cx;000FH÷0AH=0001H......5H,(ax)=0001H,(dx)=5H  
    mov bx,ax;(bx)=0001H  
    pop ax;(ax)=4240H  
    div cx;54240H÷0AH=86A0H......0H,(ax)=86A0H,(dx)=0H,(rem(H/N)*65536+L)/N的商  
    mov cx,dx;(cx)=0H;(rem(H/N)*65536+L)/N的余数  
    mov dx,bx;(dx)=0001H,int(H/N)  
    pop bx;(bx)=0H  
    ret  
;名称:print  
;功能:在屏幕指定位置,用指定颜色,显示一个用0结尾的字符串  
;参数:参数:(dh)=行号,(dl)=列号(0~80),(cl)=颜色,ds:[bx]:该字符串的首地址  
;返回:显示在屏幕上   
print:
    push dx
    push cx
    push si
    push ax
    push ds
    mov si,bx;通过它给的参数计算它所在的行和列
    mov bx,dx
    mov ax,0b800h
    mov es,ax
    mov ax,0a0h
    mov bl,bh
    mov bh,0h
    mul bx 
    mov bx,ax
    mov al,02h
    dec dl
    mul dl
    add bx,ax
    mov dl,cl
    mov ch,0
    push bx
    mov bx,si
    pop si
    show:
        mov cl,ds:[bx]
        jcxz ok
        mov al,ds:[bx]
        mov ah,dl
        mov es:[si],ax
        inc bx
        add si,2
        jmp short show
        ok: 
            pop ds
            pop ax
            pop si
            pop cx
            pop dx
            ret
code ends  
end main

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值