在8051晶片上,(組合語言)用氣泡排序法來排列地址為30H到50H的數值大小

2022-07-06 17:01:52 字數 5745 閱讀 4261

1樓:胖大海君

嘿嘿 俺來幫幫你吧

1 第八句也就是 cjne @r0,a ,next 出錯了

這是一條非法指令 即51微控制器指令表中不存在的指令

正確的寫法是:

cjne @r0, #data , next 即採用指標(暫存器間接定址)的儲存器單元內容

只能與立即數比較 不能與累加器a比較

2 你是要進行2個變數資料的比較 建議採用cjne a, direct, next 指令

呵呵 滿意 就給俺加分嘍 (早知有人已經答了 何必再答啊 回答時看見沒人答啊 ??)

組合語言用「冒泡法」排序

2樓:魔法師00可可

樓主寫了那麼多,而且格式還有差別,不知道具體是幾個

下面用10個舉例

data segment

dat db 20,-10,80,-5,-70,-9,125,-15,0,40

count db 10,10

data ends

;code segment

assume cs:code,ds:data,es:data

start:mov ax,data

mov ds,ax

mov es,ax

mov bl,1

lp1: cmp bl,0

je lp4

xor bl,bl

mov cl,count

dec cl

push cx

lea di,dat

lp2:mov al,[di]

cmp al,[di+1]

jle lp3

xchg [di+1],al

mov [di],al

mov bl,1

lp3:inc di

loop lp2

pop cx

mov count,cl

jmp lp1

lp4:mov cl,10

lea di,dat

sc:mov ax,0

mov bh,2

mov al,[di] ;取數

cmp al,0 ;如果是正數則跳

jge next

neg al ;如果是負數 先將 al中的負數取補轉成對應的 正數

push ax

mov ah,02h ;同時顯示 負數的標記 '-'

mov dl,'-' ;注意這個時候 ax 的值會因為 21h中斷的呼叫而改變:) 所以先要儲存起來

int 21h ;就是說 int 21h 中斷將會有一個返回值

pop ax ;以前我也出現過一樣的問題,後來除錯的時候才發現原來某些中斷之後ax會改變

next:xor ah,ah

div count+1 ;除以 10 取 十位

mov dh,ah ;ah 是餘數 al 是商

add al,30h

mov dl,al

mov ah,02h

int 21h ;顯示 十位上的數值(如果只是兩位數的話)

mov al,dh

xor ah,ah

; div count+1 ;這為什麼還要除以10?如果說是處理3位數的話,應該把商除10而不是把餘數除10

add ax,3030h

mov dl,al ;所以最好在顯示時 判斷是否是 大於 100 或者 小於 100 再根據判斷結果來處理 div

; mov bl,ah ;ah才是所要的,故不應該再列印 al(商)值了, 總之這裡在處理 位數的顯示時有點問題

;在這裡,如果是2位數可以正確顯示如果是3位則不能,所以最後的125顯成了 <5

outp: mov ah,2

int 21h

dec bh

jz xt

mov dl,bl ;顯示個位數

jmp outp

xt: dec cl

jz done

inc di

jmp sc

done: mov ah,4ch

int 21h

code ends

end start

用微控制器組合語言編寫從30h開始的100資料的排列 從小到大程式

3樓:匿名使用者

一批單位元組無符號數,以r0為首地址指標,r2中為位元組數,將這批數進行升序排列.

sort: mov a,r0 ;

mov r1,a ;(r1)為首地址

mov a,r2 ;位元組數送入r5

mov r5,a ;(r5)為位元組數

clr f0 ;互換標誌位f0清零

dec r5 ;迴圈n-1

mov a,@r1 ;

loop: mov r3,a ;(r3)為前一個數inc r1 ;地址指向下一個數

clr c ;

mov a,@r1 ;取下一個數

subb a,r3 ;比較大小

jnc loop1 ;如果進位位cy=0,則轉移setb f0 ;互換標誌位f0置1

mov a,r3 ;前面大的數放到a

xch a,@r1 ;互換後,小的數在a,大數在@r1dec r1 ;(r1)指向前一個地址

xch a,@r1 ;小的數放到前一個地址inc r1 ; (r1)指向下一個地址

loop1: mov a,@r1 ;取下一個數djnz r5,loop

jb f0,sort 如果直接定址位=1,則轉移ret這是微控制器組合語言的經典冒泡法排序,看懂了,對你很有幫助!把r0=30h ,r2=100h-30h代入,就可以得到你要的結果

組合語言,冒泡法排序

4樓:做而論道

顯示,要先變換成 ascii 碼。

……jnz   loop1

mov   ah, 2

mov   cx, 10

displ:

mov   dl, [si]

add   dl, '0'      ;--加上這句int   21h

dec   si

loop  displ

mov   ax, 4c00h……

用組合語言編寫一個首地址為buffer的10位元組陣列,用氣泡排序法是陣列中的數從小到大排序

5樓:轉頭空夢

data segment

buffer db 10 dup(?) 定義 是個位元組數 我這邊直接代替了

data segment

code segment

assume cs:code,ds:data

start:mov ax,data

mov ds,ax

xor ax,ax

lea si,buffer

mov bl,9 外迴圈次數

next1:mov cl,bl 內迴圈次數

mov di,si

next2:mov al,di

inc di

cmp al,di

jb next3 第一個數小於第二個數的話 不交換

mov dl,[di] 否則交換

mov [di-1],dl

mov [di],al

next3:dec cl

jnz next2

dec bl

jnz next1

mov ah,4ch

int 21h

code ends

end start

6樓:仒雨

我這裡有個以前編的串排序程式(組合語言的)是用冒泡法排的,要的話說下郵箱給你發過去。

用組合語言,在鍵盤裡輸入10個學生的成績,用氣泡排序法從大到小進行排 15

用組合語言實現氣泡排序演算法??

7樓:

mov就是簡單的傳送語句啦!lz問的應該是功能吧。。呵呵首先要知道氣泡排序的原理:

把一組數從第一個數開始兩兩相比。小的在前(從小到大排),否則交換位置你這段**loop1應該是控制迴圈次數的,loop2才是比較大小的!你能給我完整的**段麼?

我可以給你解釋。。。

8樓:匿名使用者

;===緩衝區定義例子===

buf db '256489713'

n equ $-buf

;===起泡排序**例子===

lea si,buf ;緩衝區地址

mov cx,n ;緩衝區中要排序的數值個數sss_lp1:

dec cx

jz sss_out

push si

push cx

sss_lp2:

mov al,[si]

cmp al,[si+1]

jc sss_next

xchg al,[si+1]

mov [si],al

sss_next:

inc si

loop sss_lp2

pop cx

pop si

jmp sss_lp1

sss_out: ;完成退出處

9樓:匿名使用者

public void accp(int a)

} }}

氣泡排序(組合語言)

10樓:鯤鵬展翅

dseg segment

n equ 10

buffer db 9,11,2,7,21,13,2,0,14,3dseg ends

cseg segment

assume cs:cseg, ds:dsegmain proc far ;主程式入口

mov ax, dseg

mov ds, ax

mov cx,n

dec cx

loop1: mov di,cx

mov bx,0

loop2: mov al,buffer[bx]cmp al,buffer[bx+1]

jge continue

xchg al,buffer[bx+1]

mov buffer[bx],al

continue: add bx,1

loop loop2

mov cx,di

loop loop1

mov ah,1;按任意鍵退出

int 21h

mov ax, 4c00h ;程式結束,返回到作業系統系統int 21h

main endp

cseg ends

end main

組合語言裡jc指令時啥意思JC在組合語言中什麼意思

jc jump if carry 當運算產生進位標誌時,即cf 1時,跳轉到目標程式處。例如 add al,bl jc carrybit inc al 如果al bl產生了進位,這一句就不執行了。carrybit neg al 這段程式沒有任何意義,僅僅作為示例哈。相同的指令還有 jnc,當cf 0...

組合語言嵌入c語言在codeblocks編譯器下應該怎麼寫

include using namespace std int main 請問用code blocks 編c語言程式,應該用什麼編譯器呢?如果是mingw setup的話是第一個gnu gcc 如果不是就選擇你電腦中安裝的編譯器 如何在codeblocks中執行c語言程式?選擇正確的語言就行了!剛開...

用arm組合語言實現下列c語言語句 ifab

keil 編譯完能直接看到彙編 的啊,幹嘛要自己翻譯 int main int argc,char argv memset ifr i arm組合語言實現下列c語言語句 if a b x a b 8 else y a c b 20 gnu彙編語法 a word 1 b word 2 c word 3...