2015-05-24 3 views
1

Мне нужно Bubblesort неорганизованный массив с 7 целыми числами от самого большого до самого маленького, чтобы он выглядел как 9,6,5,4,3,2,1.
Я побежал мой код через компилятор, и он говоритBubble сортировать по массиву на языке сборки

Compiler Error

Я не могу понять, в чем проблема с этим кодом:

code segment 
assume ds:code,cs:code 
start: 
mov ax,code 
mov ds,ax ;code start 
ARR: dw 1,2,4,3,6,5,9 
mov ch,0h 
mov cl,1h 
mov bh 7h 
jmp assign_nums 
restart: 
mov ch,0h 
mov cl,1h 
dec bh 
jmp assign_nums 
swap: 
mov ch,dl 
mov cl,dh 
jmp next 
next: 
cmp bh,cl 
je restart 
add ch,1h 
add cl,1h 
jmp assign_nums 
assign_nums: 
cmp bh,0h 
je done 
mov dh,[ARR+ch] 
mov dl,[ARR+cl] 
cmp dh,dl 
jl swap 
jnl next 
done: 
nop 
code ends 
end start 

ответ

2

За 1-й ошибки вы забыли набрать запятая между регистром и немедленным.

Для 2-й и 3-й ошибок регистры CH и CL не могут использоваться для адресации памяти. Вместо этого используйте SI, DI или BX.

Поскольку ваш массив определен как слова, вы должны рассматривать его как таковые!
Изменения

mov dh,[ARR+ch] 
mov dl,[ARR+cl] 

в нечто подобное (зависит от других вариантов вы делаете)

mov ax,[ARR+si] 
mov dx,[ARR+di] 

Пожалуйста, обратите внимание, что вы разместили массив среди команд. Это приведет к сбою вашей программы, как только вам удастся ее скомпилировать. Либо поместите массив в отдельный сегмент данных вашей программы, либо перепрыгните через эту строку.

start: 
mov ax,code 
mov ds,ax 
jmp start2 
ARR: dw 1,2,4,3,6,5,9 
start2: 
mov ch,0h 
+0

так что это куча спагетти кода? есть ли лучший способ кодировать это? Я не знаю, что я здесь делаю с кодом сборки – Puloko

+1

Ответ от user3144770 замечательный. Единственное изменение, которое я сделал бы, это не дать возможность перепрыгивать через ARRAY. Поместите ARR в .data сегмент '.DATA ИЛИ .FARDATA DSEG' ' ARR: dw 1,2,4,3,6,5,9' – BKCOHEN

-1

Иногда фиксируя код сложнее, чем сделать новую, поэтому я создал новую пузырьковую сортировку для убывающего порядка (от больше, чтобы меньше). Для этого кода я использовал EMU8086. Я добавил комментарии и попытался это сделать, как C++ или Java, в надежде, что поможет вам понять это, вот это:

.model small 
.stack 100h 
.data 

arr dw 7,99,1418,0,521,66,255 ;ARRAY OF 7 INTEGERS. 
i dw ? 
j dw ? 

;----------------------------------------- 

.code 
start: 

;INITIALIZE DATA SEGMENT. 
    mov ax, @data 
    mov ds, ax     

    call bubble_sort_descending 

;WAIT FOR ANY KEY.  
    mov ah, 7 
    int 21h 

;FINISH PROGRAM. 
    mov ax, 4c00h 
    int 21h 

;----------------------------------------- 
;for (i = 0; i < len-1; i++) 
; for (j = i+1; j < len; j++) 
; if (arr[i] < arr[j]) // '<' BECAUSE IT'S ASCENDING. 
;  exchange 

bubble_sort_descending proc 
    mov i, 0    ;I = 0. 
fori: 
    mov ax, i   ;AX = I. 
    inc ax    ;I++. 
    mov j, ax   ;J = I++. 
forj: 
;GET ARR[ I ]. 
    mov si, offset arr 
    mov ax, i 
    shl ax, 1   ;I * 2, BECAUSE EVERY COUNTER IS 2 BYTES. 
    add si, ax 
    mov ax, [ si ]  ;AX = ARR[ I ]. 
;GET ARR[ J ]. 
    mov di, offset arr 
    mov cx, j 
    shl cx, 1   ;J * 2, BECAUSE EVERY COUNTER IS 2 BYTES. 
    add di, cx 
    mov cx, [ di ]  ;CX = ARR[ J ]. 
;IF (ARR[ I ] < ARR[ J ]). 
    cmp ax, cx   ;CMP ARR[ I ], ARR[ J ]. 
    jae bigger   ;IF (ARR[I] >= ARR[J]) NO EXCHANGE. 
;EXCHANGE BECAUSE ARR[ I ] IS NOT BIGGER THAN ARR[ J ]. 
    ;EXCHANGE COUNTERS IN ARR. 
    mov [ si ], cx  ;ARR[ I ] = ARR[ J ]. 
    mov [ di ], ax  ;ARR[ J ] = ARR[ I ]. 
bigger: 
;NEXT J. 
    inc j    ;J++. 
    cmp j, 7 
    jbe forj    ;IF (J <= 7) REPEAT. 
;NEXT I. 
    inc i    ;I++. 
    cmp i, 7 
    jb fori    ;IF (I < 7) REPEAT. 

    ret 
bubble_sort_descending endp  

;----------------------------------------- 

end start 
-1

Это простой код для пузырьковой сортировки

iclude'emu8086.inc' 

org 100h 
.data 

array db 9,6,5,4,3,2,1 
count dw 7 

.code 

mov cx,count  
dec cx 

nextscan:   
mov bx,cx 
mov si,0 

nextcomp: 

mov al,array[si] 
mov dl,array[si+1] 
cmp al,dl 

jnc noswap 

mov array[si],dl 
mov array[si+1],al 

noswap: 
inc si 
dec bx 
jnz nextcomp 

loop nextscan 



; this loop to display elements on the screen 

mov cx,7 
mov si,0 

print: 

Mov al,array[si] 
Add al,30h 
Mov ah,0eh 
Int 10h 
MOV AH,2 
Mov DL , ' ' 
INT 21H 
inc si 
Loop print 


ret 

0

; СОРТИРОВАННАЯ МАССА С ИСПОЛЬЗОВАНИЕМ АБСОЛЮТНОГО АЛГОРИТМА СКОРОСТИ

.MODEL SMALL 
.STACK 100H 
.DATA 
    N DB 44H,22H,11H,55H,33H  ; N is an array  
    LEN DW 5 ; LENGTH OF ARRAY N 
.CODE 
MAIN PROC 
MOV AX,@DATA 
    MOV DS,AX 

MOV CX,LEN ;Cx is counter for OUTERLOOP CX=5  
DEC CX  ; CX = 4 

OUTERLOOP: 
    MOV SI,0   ; SI is the index of array N 
    MOV DX,CX ; Dx is counter for INNERLOOP 
INNERLOOP:  
    MOV AH,N[SI] ; assign the number N[SI] into reg.AH 
    MOV AL,N[SI+1] ; assign the next number N[SI+1] into reg.AL 
    CMP AH,AL  ; Compare between N[SI] and N[SI+1] <BR> 
    JC CARRY  ; if AL > AH => Carry Flag =1 ,THEN jump to carry 
    MOV N[SI] , AL ; else , Do Switching bteween N[SI] and N[SI+1] 
    MOV N[SI+1] ,AH 
CARRY: 
    INC SI 
    DEC DX 
    JNZ INNERLOOP 
    LOOP OUTERLOOP 
;exit 
MOV AH,4CH ;service number  
INT 21H  ; interrupt 
MAIN ENDP 
END 
+0

Просьба указать некоторые пояснения в своем ответе и использовать правильный синтаксис подсветка. – bastelflp

+0

Пара магазинов может быть выполнена как «mov n [si], AX' для хранения AL и AH вместе с 16-разрядным хранилищем. (Но [на современных процессорах Intel вы получите замедление замещения частичных регистров] (https://stackoverflow.com/questions/45660139/how-exactly-do-partial-registers-on-haswell-skylake-perform-writing -al-seem-to). Тем не менее, вы используете [медленную инструкцию цикла] (https://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel -было реализовано-эффективно), поэтому, очевидно, вы не оптимизируете производительность на современных процессорах.) –

Смежные вопросы