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

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

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

核心**

組合語言程式設計,組合語言程式設計?

嚴格要求輸入 0 7。輸出為分別是 0 2 4 6 8 a c e。下列程式,可滿足題目要求。assume cs cccc segment i y db 02468ace s t mov ax,cc mov ds,axi x mov ah,07h int 21h cmp al,0 jb i x cm...

怎樣用組合語言讀寫檔案

檔案,要先 建立 和 開啟 還要在其中定位,才能讀寫字元,之後要 關閉 要用到系統功能呼叫等等。至於磁碟的0面0道1扇區的讀寫,是更為低階 深入 的操作,要用到25h 絕對磁碟讀功能 26h 絕對磁碟寫功能。弄不好,會破壞磁碟檔案系統,造成系統的崩潰,不建議施行這個操作。xp有保護機制,一般不讓進行...

組合語言程式設計,組合語言程式設計步驟 有那幾步

1.c,e 這個題出要考查幾條算術和邏輯指令,仔細一點就可以了。2 a,d b錯在數字大過了乙個位元組 c錯在用數字來標識標號了 e錯在用?號定義dup的次數 3 b,e 同一 c,d不影響al的值 4 a c d e 5 a b 1 將dl中小寫字母轉換為大寫,可用c e指令。a add dl,2...