汇编语言如何在屏幕上画点

屁屁很痛 2008-08-23 11:44:18
小弟初学汇编语言:
请教汇编语言如何在屏幕上画点阿,是否需要调用中断,不调用中断可以吗,如何直接向显示缓冲区中画点,请大大们说详细点.谢谢
...全文
698 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
屁屁很痛 2008-08-25
  • 打赏
  • 举报
回复
楼上误会了,我说的是11楼,我发帖时还没看到你的帖子
BAYNPU 2008-08-25
  • 打赏
  • 举报
回复
请楼主看看我的源程序是否符合您的要求:
.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
屁屁很痛 2008-08-24
  • 打赏
  • 举报
回复
那么我现在因该去看那些资料?
cnzdgs 2008-08-24
  • 打赏
  • 举报
回复
先要将显示模式切换到图形模式。
int 10h的0ch号功能可以在屏幕上画点,但效率很低,几乎没人用这种方法。在屏幕上画点基本上都是直接控制显卡,向显存中输出数据,各种显示模式的处理方法不同,你可以找一下VGA或者VESA方面的资料看一下,VGA是早期版本,主要是640*480分辨率16色模式,而且不易编程,VESA支持更高的显示模式,编程也比较容易。
cnzdgs 2008-08-24
  • 打赏
  • 举报
回复
B8000H处是文本输出的显存,图象的显存在A0000H处。
cnzdgs 2008-08-24
  • 打赏
  • 举报
回复
先搜索相关资料来看,不然即使有例子也很难看懂。
蒋晟 2008-08-24
  • 打赏
  • 举报
回复
什么操作系统?一般都是通过操作系统的画图API来调用显卡驱动来画的
屁屁很痛 2008-08-24
  • 打赏
  • 举报
回复
小弟用的是x86汇编,有直接在内存b80000中直接操作可以吗,,有没有相关的代码例子参考
superdiablo 2008-08-24
  • 打赏
  • 举报
回复
x86的16位汇编直接把要显示的像素写到某个规定的内存地址即可
win32汇编在用户模式下不允许直接读写物理内存,需要调用windows的API
gzgzlxg 2008-08-24
  • 打赏
  • 举报
回复
我上面说了,图形显示有多种模式可选择,就看你怎样去设置,对于320x200,你可以用一个字节表示一个象素,但对于640x480,你算算,需要多少个字节才能将这么多的点显示出来,你的图形缓冲区有多大?算算不就明白了,所以,象素多了,就会采用别的方法,即多页面来描述。
“谢谢楼上的回答,不过这个例子好像是显示字符的,不符合我的要求”
你这句话我实在不能明白,我在上面所说的是真实的图形显示方式,是直接通过IO口选择页面,然后直接写A000:0的图形区域,怎么和B800:0的字符区混在一起谈,对牛弹琴。懒得在说了,分也不要了。
屁屁很痛 2008-08-24
  • 打赏
  • 举报
回复
谢谢楼上的回答,不过这个例子好像是显示字符的,不符合我的要求

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

我看得是13h这个功能320x200 256色 说是一个字节代表一个像素,那么像素的颜色是则么规定的?谢谢大大们能回答一下
gzgzlxg 2008-08-24
  • 打赏
  • 举报
回复
楼上的例子和楼主的要求相差太远,楼主要求的是图形模式,是在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
jxc25 2008-08-24
  • 打赏
  • 举报
回复
那些全屏的游戏都直接向显存中输出数据的
能把显卡的位图映射到R3自己画的
alan001 2008-08-24
  • 打赏
  • 举报
回复
VGA 640*480 16色图形模式,图像存储单元从B8000H开始
touta 2008-08-24
  • 打赏
  • 举报
回复
;***本文件为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上的一段啊例子..
很老的了
cnzdgs 2008-08-24
  • 打赏
  • 举报
回复
VGA或者VESA,前面已经说过了,看你想采用哪种图形模式,建议用VESA。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧