首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 汇编语言如何在屏幕上画点 [无满意答案结帖,结帖人:asm_shen]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asm_shen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-23 23:44:18 楼主
    小弟初学汇编语言:
    请教汇编语言如何在屏幕上画点阿,是否需要调用中断,不调用中断可以吗,如何直接向显示缓冲区中画点,请大大们说详细点.谢谢
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jiangsheng
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 00:26:061楼 得分:0
    什么操作系统?一般都是通过操作系统的画图API来调用显卡驱动来画的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

      15

    发表于:2008-08-24 00:41:512楼 得分:0
    先要将显示模式切换到图形模式。
    int 10h的0ch号功能可以在屏幕上画点,但效率很低,几乎没人用这种方法。在屏幕上画点基本上都是直接控制显卡,向显存中输出数据,各种显示模式的处理方法不同,你可以找一下VGA或者VESA方面的资料看一下,VGA是早期版本,主要是640*480分辨率16色模式,而且不易编程,VESA支持更高的显示模式,编程也比较容易。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • alan001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 10:27:133楼 得分:0
    VGA 640*480 16色图形模式,图像存储单元从B8000H开始
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jxc25
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 10:31:124楼 得分:0
    那些全屏的游戏都直接向显存中输出数据的
    能把显卡的位图映射到R3自己画的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • superdiablo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 11:24:465楼 得分:0
    x86的16位汇编直接把要显示的像素写到某个规定的内存地址即可
    win32汇编在用户模式下不允许直接读写物理内存,需要调用windows的API
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asm_shen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 12:21:246楼 得分:0
    小弟用的是x86汇编,有直接在内存b80000中直接操作可以吗,,有没有相关的代码例子参考
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

      15

    发表于:2008-08-24 12:36:087楼 得分:0
    先搜索相关资料来看,不然即使有例子也很难看懂。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

      15

    发表于:2008-08-24 12:39:008楼 得分:0
    B8000H处是文本输出的显存,图象的显存在A0000H处。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asm_shen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 12:43:489楼 得分:0
    那么我现在因该去看那些资料?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 6

      2

      15

    发表于:2008-08-24 13:16:1010楼 得分:0
    VGA或者VESA,前面已经说过了,看你想采用哪种图形模式,建议用VESA。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • touta
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 21:25:2811楼 得分:0
    ;***本文件为DOS.exe标准模板文件***
    ;//////////////////////////////////////////////////////////////////
    ;程序名:10.10试验
    ;作者:Xpoy
    ;完成日期:???-??-??
    ;程序说明:10.10试验
    ;//////////////////////////////////////////////////////////////////
           
    ;--------------------------------------------------------------------------------
    ;这个程序只是3个子函数
    ;Change_24_80_screen,fix_div_flow,num_D
    ;分别实现改变20*80窗口的显示,修复溢出问题的div,数据到十进制ASCII的转换

    ;--------------------------------------------------------------------------------

           
           
            ; 数据段
    DSEG    SEGMENT ;定义数据段
      ;TO DO:数据添加到下面
      ;//////////////////////////////////////////////////////////////

    DSEG    ENDS


            ; 堆栈段
    SSEG    SEGMENT STACK  ;定义堆栈段

            DB      100H    DUP(?) ;设置堆栈段大小为100H

    SSEG    ENDS

            ; 代码段
    CSEG    SEGMENT ;定义代码段

            ASSUME  CS:CSEG, DS:DSEG, SS:SSEG  ;关联段寄存器

    START:        ;主程序入口点
      ;TO DO:添加主程序代码
    ; ------------------------------------------------------
    Change_24_80_screen:
    ;这个函数有3个参数,dh(行号),dl(列号),cl(字体格式代码),无返回值
    push ax;
    push cx;
    push di;
    sub ax,ax
    mov al,dh
    mul 10h;
    push ax
    sub ax,ax;
    mov al,dh
    mul 2h;到这儿要显示在屏幕上指定位置需写入的地址已经计算出来了 b800:ax+[sp-2]
    add ax,[sp-2]
    mov di,ax;
    mov ah,cl;
    filling:
    mov ptr byte b800:[di],ah;
    mov ptr byte b800:[di+1],[si];
    inc di
    inc di
    inc si
    mov cx,[si]
    jcxz over;
    jmp filling;
    over:
    pop di;
    pop cx;
    pop ax;
    retn;

    fix_div_flow:
    ;这个函数有3个参数,ax(被除数低16位),dx(被除数高16位),cx(除数),返回值保存在dx:ax
    push cx
    push dx
    cdq
    div cx
    pop ax
    push ax
    cdq
    div cx
    mov dx,ax
    pop ax
    retn;

    num_D:
    ;这个函数有2个参数,ax=需要转换的数(因为算法的局限性,不能大于65535),ds:si指向保存结果的地址
    push ax
    push cx
    push dx
    cdq
    div 10000
    push ax
    cdq
    div 1000
    push ax
    mov ax,dx
    div 100
    push al
    cdq
    div 10
    push al
    push ah;为了思路清楚点,这儿做很多废步骤;现在堆栈中一次保存着数字的每个位
    mov dx,5
    lop:
    pop cx
    jcxz lop
    add cx,30h
    mov [si],cx;
    mov cx,dx
    dec dx;
    loop lop
    ret:
    pop dx
    pop cx
    pop ax
    retn

    ;-------------------------------------------------------
            ; 退出 DOS
            MOV    AX, 4C00H  ;返回DOS系统
            INT    21H

    CSEG    ENDS
    ;TO DO: 添加其他段 [可选]
    ;///////////////////////////////////////////////////////////////

    END START      ; 程序结束


    8086上的一段啊例子..
    很老的了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gzgzlxg
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 22:44:5512楼 得分:0
    楼上的例子和楼主的要求相差太远,楼主要求的是图形模式,是在A000h的图形区做活,你弄到B800字符区,离题太远。
    楼主的提问实在太难回答,我虽然有能力回答这个问题,但实在是没有办法在这些简单的问答中回答,所以当时见到这个问题采取不理睬政策。
    2楼的高手估计和我一样,只是指点你去找一本关于VGA或其后的VESA格式的书去读,这是正道,图形显示不是三言两语能够说的清楚的。
    虽然说A000h是图形区的读写地址,但真实操作远不是那么容易,不是你想象的那样,如同B800字符区那样,写一个属性,写一个字符就可以实现的,图形显示有多种方法实现,其中比较通用的一种就是A000:0第一字节所带表的的是屏幕左上角的水平的8个点,这就和字符区完全不同,对于16位色彩而言,同时有4个页面,就相当于有4个A000:0。也就是说,在4个页面上的同一个BIT的不同值决定了屏幕上的一个象素的颜色,也就是说,要显示一个有颜色的象素,需要同时写4个页面才能完成,而地址都是在A000:0,通过写VGA的IO口来选择每次写入某个页面。
    实在是不想说了,因为我都不知怎么用语言来说,其实画一张图一眼就可以看明白。
    佛曰“不可说,不可说”哈哈,我的表达能力实在不足以说清楚这个过程,真实做起来只要明白道理,并不是太困难的,其实写几个子程序,每次写某个页面,即调用某个子程序,然后就是计算点亮这个象素所对应的bit在每个页面是0还是1,然后就是将这个信息写入每个页面,然后这个象素就按你所要的色彩点亮了,当然具体操作不是每个点写的,而是一次写一个页面。对于16色,写4个页面,对于256色需要写8个页面。然后就是计算你那个要画的曲线的每一个点在图形区的那个位置,这个非常简单,你在纸上画一下,对于640*480,从左到右640个点,将640/8即每一排象素所占用的字节,然后就是第二排,就这样计算,都写成一个一个的小模块,然后调用。
    不能再写了,我自己都块晕了。
    88
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asm_shen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 22:52:2813楼 得分:0
    谢谢楼上的回答,不过这个例子好像是显示字符的,不符合我的要求

    我在网上看了一些例子和文章,其中那个调色板具体是设么东西啊,我现在还不是很理解,和操作3c8h和3c9h两个端口.

    我看得是13h这个功能320x200 256色 说是一个字节代表一个像素,那么像素的颜色是则么规定的?谢谢大大们能回答一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gzgzlxg
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 23:07:1414楼 得分:0
    我上面说了,图形显示有多种模式可选择,就看你怎样去设置,对于320x200,你可以用一个字节表示一个象素,但对于640x480,你算算,需要多少个字节才能将这么多的点显示出来,你的图形缓冲区有多大?算算不就明白了,所以,象素多了,就会采用别的方法,即多页面来描述。
      “谢谢楼上的回答,不过这个例子好像是显示字符的,不符合我的要求”
    你这句话我实在不能明白,我在上面所说的是真实的图形显示方式,是直接通过IO口选择页面,然后直接写A000:0的图形区域,怎么和B800:0的字符区混在一起谈,对牛弹琴。懒得在说了,分也不要了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • asm_shen
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 10:25:2215楼 得分:0
    楼上误会了,我说的是11楼,我发帖时还没看到你的帖子
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • BAYNPU
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 18:15:4316楼 得分:0
    请楼主看看我的源程序是否符合您的要求:
    .model small
    .data
    .code
    mov ax,@data
    mov ds,ax
    mov ax,0013h
    int 10h
    mov ax,0
    mov ch,1
    mov cl,0
    mov si,199
    again:mov dx,320
    mov bx,1
    next:call vga_color256
    inc bx
    dec dx
    jnz next
    inc ch
    inc ax
    dec si
    jnz again
    mov ah,0
    int 16h
    mov ax,0003h
    int 10h
    mov ax,4c00h
    int 21h
    vga_color256 proc near
    push ax
    push dx
    push di
    push es
    mov dx,0a000h
    mov es,dx
    mov dx,320
    mul dx
    add ax,bx
    mov di,ax
    mov es:[di],ch
    pop es
    pop di
    pop dx
    pop ax
    ret
    vga_color256 endp
    end
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved