1樓:匿名使用者
寫一下簡單的演算法吧,
先提供一個簡單的畫點子程式:
;在螢幕顯示一點或一畫素子程式
;輸入引數:
; bx = 行地址(0-479)
; si = 列地址(0-639)
; dl = 顏色 (0-15)
; 640*480顯示模式
dot proc near
push cx ;儲存顏色
push dx
mov ax, 80 ;行地址
mul bx
mov di, ax ;儲存行地址
mov ax, si ;計算列地址
mov dh, 8
div dh
mov cl, ah ;得到移位數值
mov ah, 0
add di, ax ;構成畫素地址
mov al, 80h
shr al, cl ;計算相應位遮蔽暫存器中的位
push ax ;儲存位遮蔽字
mov dx, 3ceh ;圖形地址暫存器
mov al, 8 ;選擇位遮蔽暫存器
out dx, al
mov dx, 3cfh ;位遮蔽暫存器
pop ax ;得到位遮蔽暫存器
out dx, al
mov dx, 3c4h ;順序地址暫存器
mov al, 2 ;選擇映象遮蔽暫存器
out dx, al
mov dx, 3c5h ;映象遮蔽暫存器
mov al, 0fh ;使所有位平面均有效
out dx, al
mov al, es:[di] ;先讀
mov byte ptr es:[di], 0 ;清除原有顏色
pop ax ;從棧中恢復顏色
push ax
out dx, al
mov byte ptr es:[di], 0ffh ;寫記憶體
pop dx ;返回
pop cx
retdot endp
到時可以用macro來呼叫,比如:
setpixel macro x, y, color
mov bx, x
mov si, y
mov dl, color
call dot
endm
呼叫時用 setpixel x, y, color就可以了,color值為0-15
當然如果你用api的話,就更簡單了, 直接invoke setpixel x, y, color就可以了..
這裡提供的是對視訊記憶體和記憶體操作的setpixel
在主程式中要先做下列初始化:
mov ax, 0a000h ;視訊記憶體地址
mov es, ax
cld ;遞增
mov ax, 12h ;設定顯示模式為12h
int 10h ;清屏
然後提供一個畫圖演算法, 我用巨集彙編寫的:
brshellipse xo, yo, r
mov xi, 0
mov yi, r ;這裡xi, yi是每次畫點的座標
mov delta, 2*(1-r)
.while yi >= 1
setpixel xo + xi, yo + yi, color
.if delta < 0
mov delta1, 2*delta+2*yi - 1
.if delta1 <= 0
inc xi
mov delta, delta+2*xi + 1
.else
inc xi
dec yi
mov delta, delta+2*xi-2*yi + 2
.endif
.elseif delta > 0
mov delta1, 2*delta - 2*xi - 1
.if delta1 <=0
inc xi
dec yi
mov delta, delta+2*xi-2*yi + 2
.else
dec yi
mov delta, delta-2*yi + 1
.else
inc xi
dec yi
mov delta, delta + 2*xi - 2*yi + 2
.endif
.endw
僅供參考, 沒有經過測試,
2樓:尼歐趙
關鍵是演算法,你自己把它翻譯成asm吧:
// bresenham 畫圓演算法基本例程void b_circle(int x0,int y0,int r,char color)
for(i=starty;i else x++; }x=y; if(y) for(i=starty;i 3樓:匿名使用者 演算法還不簡單嗎 用bios 的int 10h 中斷中的話畫素的方法實現。 確定某一行某一列的點位圓形,然後一個迴圈,把所有於圓心距離相等的點都描出來就是一個圓了,逐行掃描,每行應該最多有兩個點符合要求。 4樓:匿名使用者 熱鬧,分類達人前三全來了,我也進來look一下。 就是啥都看不懂 5樓:匿名使用者 關鍵是演算法,你自己把它翻譯成asm吧: 用組合語言編寫一個簡單程式 6樓:sweet馮 1.計算u=(x+(y*z-100))/w 其中:x,y,z,w均為十六位有符號數。 程式如下: data segment x dw 10 ;16位變數 y dw 20 z dw 30 w dw 40 u dw ?,? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov ax,y imul z ;計算y*z,內容放在dx,ax中 mov cx,ax mov bx,dx sub cx,100 ;計算y*z-100 sbb bx, 0 mov ax,x cwd ;將x符號擴充套件,形成dx:ax中的雙字 add ax,cx ;計算x+(y*z-100),內容放在dx,ax中 adc dx,bx idiv w ;計算(x+(y*z-100))/w mov u,ax mov u+2,dx mov ah,4ch int 21h code ends end start 7樓:匿名使用者 push ax push bx pop ax pop bx 核心** c語言中的指標和組合語言中的暫存器間接定址差不多。c語言中變數的指標就是該變數的地址。如指標變數p的地址為2000h,則 p所訪問的是地址2000h的儲存單元,x p,實現把地址2000h的儲存單元的內容送給變數x。組合語言有指標這個概念,所有記憶體都可以直接用地址訪問,地址就理解為指標 組合語言中... pascal行嗎?var i,s integer begin s 0 for i 1 to 20 do if i mod 2 0 thens s i writeln s end.啊,看錯了,以為是程式語言,sorry data segment sum1 dw 0 sum2 dw 0 data end... 一 mov di,0000h 讓ds di指向字串mov cx,n 設定迴圈次數mov al,a 設定掃描的字母cld 設定df為0repne scasb 開始掃描jz found 找到則跳轉mov di,00h 沒找到則讓di指向字串開頭found mov bx,di 讓bx記錄a所在位置hlt ...組合語言中指標的作用,組合語言裡面怎麼實現指標的功能?
用組合語言程式設計,計算1到20之間的奇數和
組合語言程式設計