1樓:匿名使用者
緊跟在你的cjne指令後根據你的比較方式再加一條判c指令再次判斷或轉移就行了。
2樓:匿名使用者
cjne指令。***pare,jump if not equal。
3樓:興藍諾
cjne a,b,tiao(如果a與b不一樣就跳到地址標號tiao執行指令b,若一樣就繼續執行下一條指令a)
指令atiao:指令b
微控制器 組合語言 兩數比較大小
4樓:匿名使用者
微控制器有比較指令cmp的嗎,請回答者再看看書吧。可以用cjne指令,它有比較功能,如cjne a,#data,label 當a<#data時,進位位置一,就可以判斷了。程式如下:
clr c ;先把進位位清零,以防誤判cjne a,#data,no_equ ;不等則轉到no_equ,相等則直接順序執行
....... ;執行相等時的程式no_equ:
jc lower ;繼續判斷,小於則跳轉到 lower,大於則順序執行
.......
lower:
......end
5樓:匿名使用者
不要想複雜了,兩個cmp就可以啦
cmp r0,r2
jb abc
cmp r1,r3
jb abc
jmp nobelow
abc:
...nobelow:...
6樓:匿名使用者
還是自己看書學習吧 這個簡單的問題 多看幾遍自然會了
51微控制器 用組合語言怎麼程式設計:幾個有符號數的比較大小
7樓:匿名使用者
51微控制器中,沒有專門的有符號數比較指令,只能通過一些變通的方法來實現,比如:
比較30h和40h中有符號數的大小,結果放在r2中,大於則為1,等於為0,小於為128:
cmpdat:
mov a,30h
jb acc.7,cmpf1
mov b,a
mov a,40h
jb acc.7,cmpz2 ;30h正,40h負所以30h>40h
cjne a,b,cmpz1 ;均為正,比較大小mov r2,#0
retcmpz1:
jc,cmpz2
cmpz11:
mov r2,#128
retcmpz2:
mov r2,#1
retcmpf1:
anl a,#7fh
mov b,a
mov a,40h
jnb acc.7,cmpf3 ;30h負,40h負sjmp cmpz11 ;30負,40h正,所以30h<40hcmpf3:
anl a,#7fh
cjne a,b,cmpf10 ;兩個均為負數mov r2,#0
retcmpf10:
jc cmpz2 ;30h<40h(負數小者大)sjmp cmpz11 ;30h>40h
8樓:做而論道
設內部ram中的30h和31h單元中有兩個帶符號數,求其中的大數,放在32h單元中。
; mov 32h, 30h ;先取一個放好.
mov a, 30h
clr c
subb a, 31h ;(30h)-(31h)
jnb acc.7, zzz ;差為正數則轉移.
jb ov, _end ;負、且溢位轉至結尾.
sjmp *** ;否則去存31h
zzz:
jnb ov, _end ;差為正、且無溢位轉至結尾.
***:
mov 32h, 31h
_end:
sjmp $end
9樓:匿名使用者
subb a,b
jnb cy ,d0 ;d0是a>b
51彙編實現比較三個數的大小並排序
10樓:做而論道
假設有三個數存在40h、41h、42h單元中。
先在三個數字中,找一個最大的,放在40h。
再在餘下的兩個數字中,找一個最大的,放在41h。
11樓:匿名使用者
51微控制器實現比較三個數的大小,並將數由小到大分別存入40h、41h、42h單元中
*** 0000h
ajmp main
*** 0100h
main: mov 30h,#98h
mov 31h,#88h
mov 32h,#78h
mov a,30h
cjne a,31h,***p1
***p1: jc b1
cjne a,32h,***p2
***p2: jc a1
mov 42h,30h
mov a,31h
cjne a,32h,a2
a2: jc a3
mov 41h,31h
mov 40h,32h
sjmp $
a3: mov 41h,32h
mov 40h,31h
sjmp $
a1: mov 42h,32h
mov 41h,30h
mov 40h,31h
sjmp $
b1: mov a,31h
cjne a,32h,***p3
***p3: jc b3
mov 42h,31h
mov a,30h
cjne a,32h,***p4
***p4: jc b3
mov 41h,30h
mov 40h,32h
sjmp $
b3: mov 42h,32h
mov 41h,31h
mov 40h,30h
sjmp $ ;
b2: mov 42h,32h ;
mov 41h,31h ;
mov 40h,30h ;
sjmp $end
12樓:匿名使用者
;氣泡排序
*** 0000h
sjmp main
*** 0030h
main: mov 30h,#65hmov 31h,#61h
mov 32h,#66h
mov r0,#30h
mov r3,#2
mov r4,#2
loop: mov a,@r0
inc r0
mov b,@r0
cjne a,b,k1
k1:jc l1
djnz r3,loop
djnz r4,l2
sjmp l3
l1:xch a,@r0
dec r0
mov @r0,a
inc r0
djnz r3,loop
djnz r4,l2
sjmp l3
l2:mov r0,#30h
mov r3,#1
ljmp loop
l3: nop
end;懸劍
;yinweiyounidecunzai
求微控制器組合語言怎樣程式設計才能實現將一個十六進位制數轉換為十進位制數 20
13樓:匿名使用者
程式經過**除錯通過,如下所示:
mov r0, tl0
mov r1, th0
clr a
mov r2, a;先清零
mov r3, a
mov r4, a,
mov r5, #16;共轉換十六位數loop:
clr c
mov a, r0;從待轉換數的高階移出一位到cyrlc a
mov r0, a
mov a, r1
rlc a
mov r1, a
mov a, r4;送到bcd碼的低端addc a, r4;帶進位加。自身相加,相當於左移一位da a ;十進位制調整,變成bcd碼mov r4, a
mov a, r3
addc a, r3
da a
mov r3, a
mov a, r2
addc a, r2
mov r2, a
djnz r5, loop;共轉換十六位數;-------至此,已經把th1 tl1中的數字,轉換成bcd碼,送到了r2 r3 r4。
;-------下面,分別存入r4 r3 r2 r1 r0。
mov a, r4
mov b, #16
div ab
mov r1, a
mov r0, b
mov a, r2
mov r4, a
mov a, r3
mov b, #16
div ab
mov r3, a
mov r2, b
ret希望對你有所幫助!
14樓:匿名使用者
用除法例如 0xff 轉換成十進位制數,百位十位個位分別存在r1、r2、r3中
在51微控制器中暫存器a中的數除以暫存器b中的數,商存在a,餘數存在bmov a,#0ffh
mov b,#100
mul a,b
mov r1,a //存百位mov b,a
mov b,#10
mul a,b
mov r2,a //存十位mov r3,b //存個位
15樓:
mov r6,#00h;存轉化後的數的低位mov r5,#00h;存轉化後的數的高位mov r7,#0ffh;為要轉化的
mov a,r7
cjne a,#00h,loop;判斷要轉化的數是否為0ajmp loop1
loop;mov a,r6
add a,#01h
da a
mov r6,a
addc a,#00h
da a
mov r5,a
djnz r7,loop
loop1:sjmp $
16樓:做而論道
一樓的,是在什麼地方抄的吧?文字註釋,看著眼熟。
呵呵,原來是我以前寫的答案。
17樓:匿名使用者
你確定你要的是十六進位制轉換成十進位制的程式?不是二進位制轉成十進位制的嗎?微控制器中的資料可都是二進位制的,只是通常用十六進位制表示罷了,我以前也犯過這個錯誤
微控制器組合語言中比較指令
18樓:
剛好也有這麼個困惑,已經解決了,拿出來分享下
比較轉移指令 cjnz
cjne a,#data,rel
cjne a,direct,rel
cjne rn,#data,rel
cjne @ri,#data,rel
第一條指令的功能是將a中的值和立即數data比較,如果兩者相等,就次序執行(執行本
指令的下一條指令),如果不相等,就轉移,同樣地,我們能將rel理解成標號,即:cjnea,
#data,標號。這樣利用這條指令,我們就能判斷兩數是否相等,這在很多場合是非常有用的。
但有時還想得知兩數比較之後哪個大,哪個小,本條指令也具有這樣的功能,如果兩數不相等,則cpu還會反映出哪個數大,哪個數小,這是用cy(進位位)來實現的。如果前面的
數(a中的)大,則cy=0,不然cy=1,因此在程式轉移後再次利用cy就可判斷出a中的數
比data大還是小了。
例: mov a,r0
cjne a,#10h,l1
mov r1,#0ffh
ajmp l3
l1: jc l2
mov r1,#0aah
ajmp l3
l2: mov r1,#0ffh
l3: sjmp l3
jc是判cy是0,還是1進行轉移,如果cy=1,則轉移到jc後面的標號處
執行,如果cy=0則次序執行(執行它的下面一條指令)。
分析一下上面的程式,如果(a)=10h,則次序執行,即r1=0。如果(a)不等於10h,則轉
到l1處繼續執行,在l1處,再次進行判斷,如果(a)>10h,則cy=1,將次序執行,即執
行mov r1,#0aah指令,而如果(a)<10h,則將轉移到l2處指行,即執行mov r1,#0ffh
指令。因此最終結果是:本程式執行前,如果(r0)=10h,則(r1)=00h,如果(r0)>10h,
則(r1)=0aah,如果(r0)<10h,則(r1)=0ffh。
弄懂了這條指令,其它的幾條就類似了,第二條是把a當中的值和直接地址中的值比較,第
三條則是將直接地址中的值和立即數比較,第四條是將間址定址得到的數和立即數比較,這
裡就不詳談了,下面給出幾個對應的例程。
cjne a,10h ;把a中的值和10h中的值比較(注意和上題的區別)
cjne 10h,#35h ;把10h中的值和35h中的值比較
cjne @r0,#35h ;把r0中的值作為地址,從此地址中取數並和35h比較
微控制器組合語言的程式設計問題
首先教你如何理解jnb和jb,jnb就是jump not bit,這樣不好理解,解釋一下就明白了 jump表示跳轉,not表示0,bit表示該位。它實際是條件判斷語句,意思是 如果該為為0則跳轉,否則繼續下一條。例 jnb p1.1,mark 如果p1.1位為零則跳轉到mark標誌指向的指令,否則繼...
at89c51微控制器怎麼用組合語言寫“多個延時程式”
微控制器組合語言中要使一個延時程式可以被不同情況下呼叫而延時不同的時間,可以通過類似於c語言中傳遞引數的方式來實現,舉例如下 org 0000h ljmp main org 0030h main mov p0,5ah p0上的led燈間隔點亮mov r7,50 r7是延時傳遞引數lcall dela...
c51微控制器 中斷,c51微控制器如何使用中斷
這個程式是有問題的,第一次中斷時,x先賦值0再加一,x為1,第二次中斷時,又給x賦值0,這樣每次中斷都為1,不可能為2,也就不可能執行到b,建議用全域性變數可以解決這個問題。還有一個問題,一直在執行中斷程式,下一次中斷來臨時,為同級中斷,同級中斷是否能觸發,這個問題要考慮。解決辦法 a和b放在主程式...