用組合語言程式設計,用組合語言編寫一個簡單程式

2021-09-06 09:17:16 字數 4011 閱讀 3937

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。組合語言有指標這個概念,所有記憶體都可以直接用地址訪問,地址就理解為指標 組合語言中...

用組合語言程式設計,計算1到20之間的奇數和

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 ...