1樓:匿名使用者
data segment;定義資料段
org 2000
arr db 5,2,1,0,2,3,8,6,5,9
count equ $-arr
data ends
code segment;定義**段
assume cs:code,ds:data
start:
;初始化待排序列
mov ax,seg data ;取段位址到ax
mov ds,ax ;將ax值置入ds
lea si,arr ;取陣列arr的有效位址即段內偏移置入si
mov dx,count ;將陣列元素個數置入dx
foaming:
;不足兩個元素,已有序
sub dx,1 ;外迴圈次數為count-1
jle endfoaming ;dx為1時結束外迴圈
xor bx,bx ;bx賦0
mov cx,dx ;內迴圈次數賦給計數器
foaminglop:
;開始一趟排序
mov al,[si][bx] ;依次將陣列元素賦給al (注:原程式用ax取8位數會導致錯誤結果 !)
cmp al,1[si][bx] ;與下乙個元素比較
jle next ;小於等於則不用交換
;逆序則交換
swap:
mov ah,al ;將前一元素儲存到ah (由於是8位,所以沒有用棧操作)
mov al,1[si][bx] ;將後一元素置入al
mov [si][bx],al ;將al置入前一元素位置
mov 1[si][bx],ah ;將ah其置入後一元素位置
next:
;繼續本趟排序
inc bx ;前一元素位置下移一格
loop foaminglop ;
;開始下趟排序
jmp foaming ;
endfoaming:
;結束排序
mov ax,4c00h
int 21h
code ends
end start;結束程式
改錯----你的程式還有錯誤,修改如下
data segment ;定義資料段
org 2000
arr db 5,2,1,0,2,3,8,6,5,9
count equ $-arr
data ends
code segment ;定義**段
assume cs:code,ds:data
start:
;初始化待排序列
mov ax,seg data ;取段位址到ax
mov ds,ax ;將ax值置入ds
lea si,arr ;取陣列arr的有效位址即段內偏移置入si
mov dx,count ;將陣列元素個數置入dx
foaming:
;不足兩個元素,已有序
sub dx,1 ;外迴圈次數為count-1
cmp dx,1
jle endfoaming ;dx為1時結束外迴圈
xor bx,bx ;bx賦0
mov cx,dx ;內迴圈次數賦給計數器
foaminglop:
;開始一趟排序
mov al,[si][bx] ;依次將陣列元素賦給al (注:原程式用ax取8位數會導致錯誤結果 !)
cmp al,[si][bx+1] ;與下乙個元素比較
jle next ;小於等於則不用交換
;逆序則交換
swap:
mov ah,al ;將前一元素儲存到ah (由於是8位,所以沒有用棧操作)
mov al,[si][bx+1] ;將後一元素置入al
mov [si][bx],al ;將al置入前一元素位置
mov [si][bx+1],ah ;將ah其置入後一元素位置
next:
;繼續本趟排序
inc bx ;前一元素位置下移一格
loop foaminglop ;
;開始下趟排序
jmp foaming ;
endfoaming:
;結束排序
lea si,arr
mov cx,count
disp:
mov al,[si]
xor ah,ah
call dispax
inc si
loop disp
mov ax,4c00h
int 21h
dispax proc near
; 以10進製數形式顯示無符號字的值,要顯示的值事先存 ax 中
push bx
push cx ;儲存bx、cx、dx、si
push dx
push si
push ds
push cs
pop ds
jmp numdef
divarr dw 10000,1000,100,10,1
nz db 0
numdef:
mov byte ptr nz,0 ; 狀態,看是否已輸出過非 0
push ax
lea si,divarr
mov cx,5
disp1:
pop ax
mov dx,0
mov bx,[si]
div bx
push dx
cmp al,0
jne disp2 ; 當 al不為0時輸出
cmp byte ptr nz,1 ; 當al 為0時,再比較nz 是否為 1
je disp2 ; 等於1 表示前面已輸出過非 0 應將 0 輸出
cmp cx,1 ; 當最後一位仍 為0 時 輸出 0 而非空格
je disp2
mov dl,20h
jmp disp3
disp2:
add al,30h
mov dl,al
mov byte ptr nz,1
disp3:
mov ah,2
int 21h
inc si
inc si
loop disp1
pop dx
pop ds
pop si ; 恢復bx、cx、dx、si
pop dx
pop cx
pop bx
retdispax endp
code ends
end start ;結束程式
2樓:哥德堡快遞
已經有注釋了,還注毛呢,不會連mov、push、inc都不知道吧。。。補充一下:
org 2000 ; 當前位址往後偏移2000位元組
arr db 5,2,1,0,2,3,8,6,5,9count equ $-arr ; 當前位址-arr變數的位址,這裡表示arr的位元組數。count只是乙個常熟,不佔記憶體位址
組合語言求注釋
3樓:匿名使用者
v12 equ p1.3 ;這5句申明位變數用相應的變數名取代對應的io口
v10 equ p1.2 ;
out equ p1.1 ;
full equ p3.2 ;
loww equ p3.3 ;
org 0000h ;微控制器復位後程式入口位址main: mov p1,#0ffh ;p1所有口置1mov p3,#0ffh ;p3所有口置1mov r7,#5 ;r7=5
lcall del1 ;延時
m1: jnb v12,m0 ;v12為0轉移到m0clr full ;full清零
setb loww ;loww置1
sjmp m2 ;跳轉到m2
m0:jnb v10,sleep ;v10為0轉移到sleepclr loww ;loww清零
setb full ;full置1
m2:clr out ;out清零
;lcall del1 ;延時
sjmp m1 ;跳轉到m1
sleep: setb out ;out置1m3: setb loww ;loww置1lcall del1 ;延時
clr loww ;loww清零
lcall del1 ;延時
djnz r7,m3 ;r7減1為0轉移到m3mov p1,#0ffh ;p1全置1mov p3,#0ffh ;p3全置1mov pcon,#02h ;pcon=2sjmp $ ;原地迴圈
del1: mov r1,#100 ;外層迴圈100次d1: mov r2,#100 ;中層迴圈100次d2:
mov r3,#100 ;內層迴圈100次djnz r3,$ ;r3減1不為0原地等待djnz r2,d2 ;r2減1不為0轉d2djnz r1,d1 ;r1減1不為0轉d1ret ;
del2: mov r4,#255 ;意思與del1一樣d3: mov r5,#255 ;
d4: mov r6,#255 ;
djnz r6,$ ;
djnz r5,d4 ;
djnz r4,d3 ;
retend ;程式結束
什麼是組合語言,什麼是彙編和組合語言?
叢依波弘瀾 組合語言 assembly language 是面向機器的程式設計語言。在彙編語閤中,用助記符 memoni 代替操作碼,用地址符號 symbol 或標號 label 代替地址媽。這樣用符號代替機器語盲的二進位制碼,就把機器語音變成了組合語言。於是組合語言亦稱為符號語言。使用組合語言編寫...
什麼是組合語言,什麼是彙編和組合語言?
組合語言就是計算機語言,它是有0,1組成的.通俗的說就是我們人和計算機交流的語言. 介於機器語言和高階語言之間的一種 什麼是彙編和組合語言? 揚落 彙編語copy言是一種低階計算bai機程式語言,說 低階du 並不是指語言的功能和複雜程度,而是它zhi出現在計算機發展史dao的早期,但現在仍廣泛應用...
《組合語言程式設計題目解答,組合語言程式設計題目,線上等答案!!!!急!!!!!!!!!!
3 計算1090h 1280h的和。4 ax 1090h,bx 90h。5 mov dx,1 mov ax,100h mov bx,16 imul bx 1 執行後,ax f000h,bx 16,dx ffffh 2 若將imul改為mul則執行完後,ax 1600h,bx 16,dx 000bh ...