. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  10-3显示12666,偶都注释好了,请高手给点意思  [已解决] 回复[ 4次 ]   点击[ 516次 ]  
jhszcn
[帖 主]   [ 发表时间:2008-03-25 11:15 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
;把12666,ds段中的数值以十进制,绿色显示在屏幕第8行第3列的位置

assume cs:codesg,ds:datasg,ss:stacksg

datasg segment
        dw 12666
        dw 8 dup(0)
datasg ends

stacksg segment
        dd 4 dup(0)

        
stacksg ends

codesg segment
start:
                        mov ax,datasg
                        mov ds,ax                                        ;关联ds
                        mov ax,stacksg
                        mov ss,ax
                        mov sp,16                                        ;关取ss
                        mov di,0                                        ;ds中的读写数指针                                
                        call dtoc                                        ;调用dtoc把数据改成字符的子函数,保存在堆栈段里
                        mov dh,8                                        ;屏幕显示行号
                        mov dl,3                                        ;屏幕显示列号
                        mov cl,2                                        ;屏幕显示颜色
                        call show_str                                ;调用show_str以要求显示转换后堆栈段中的字符
                        mov ax,4c00h                                ;结束程序中断参数
                        int 21h                                                ;结束
                        
        dtoc:        mov ax,[di]                                        ;ax保存要显示的数值
                        pop [di+2]                                        ;数值转换字符函数,把主函数中的ip出栈到ds:[di+2]保存起来
                        mov bx,10                                        ;用X/10取余数的方法从低位到高位求出每一位,bx放除数
                        mov [di+4],dx                                ;把dx,输入位置相关的dh,dl保存在ds:[di+4]中
                        mov [di+6],cx                                ;把cx相关的显示颜色保存在ds:[di+6]中
        agin:        sub dx,dx                                        ;除数16位,所以被除数要是32位,把被除数高16位置0
                        div bx                
                        mov cx,dx                                        ;把余数传到cx里
                        jcxz myout                                        ;余数是0,说明这个数除净了,跳转到 myout
                        add dx,30h                                        ;把余数+30h,余数对应的字符传给dx
                        push dx                                                ;dx进栈
                        loop agin                                        ;cx不等于0进入下一次循环
        myout:        mov dx,[di+4]                                ;被除数除净了,把用过的dx,cx还原
                        mov cx,[di+6]
                        push [di+2]                                        ;把调用子程序时的ip入栈
                        ret                                                        ;ip出栈,子程序返回
                        
        show_str:        pop [di+2]                                ;主函数中ip保存在ds:[di+2]的位置
                                mov ax,0b800h                        
                                mov es,ax                                ;设置es为彩显区
                                mov bx,cx
                                mov cx,5                                ;有5个字符,循环5次
                                mov ax,160                                ;每一行的字节数
                                mul dh                                        ;要显示的行一共要空多少个字节
                                add ax,6                                ;要显示的列是3,再加6个字节
                                mov si,ax                                ;把显示位置传给si
          next:                pop ax                                        ;要显示的从高到低位字符出栈
                                mov es:[si],al          ;把要显示的字符传到要显示的位置
                                inc si
                                mov es:[si],bl          ;设置要显示的参数,绿色
                                inc si
                                loop next                                ;下一个字符的循环
                                push [di+2]                                ;主函数ip入栈
                                ret                                                ;主函数ip出栈
                                
                        
codesg ends

end start
younggay
[第1楼]   [ 回复时间:2008-03-25 20:01 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
兄弟,能不能把这些东西都写到学习博客里的相关分类里啊。
mouse
[第2楼]   [ 回复时间:2008-03-26 08:36 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
写的不错,注释也很全,帖子收藏了~
jhszcn
[第3楼]   [ 回复时间:2008-03-27 20:04 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
一开始偶都不知道这里有个人博客,嘎嘎
jhszcn
[第4楼]   [ 回复时间:2008-03-28 09:44 ]   [引用]   [回复]   [ top ] 
荣誉值:10
信誉值:22
注册日期:2008-03-17 22:23
此贴由 贴主 于 [ 2008-03-28 09:44 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved