2016-11-22 72 views
0

幾個月前我剛剛開始學習彙編,希望得到一份關於Uni的任務的幫助。彙編語言8086 - 無法添加相對數量

問題的說法是:

Being given a string of bytes, sort it ascending 

我的代碼是:

assume cs:code,ds:data 

data segment 
    S1 db 2, 4, 2, 5, 2, 2, 4, 4 ;given string 
    L1 EQU $-S1 
    index1 db 0 
    index2 db 0 
    cont db 0 
data ends 


code segment 
    start: 

    mov AX,data 
    mov DS,AX 

    sort1: 
     inc index1 
     sort2: 
      inc index2 
      cmps S1[index1],S2[index2] 
      jg switch 
      jng fin1 
      switch: 
       mov S1[index1],AL 
       mov S1[index2],AH 
       mov S1[index1],AH 
       mov S1[index2],AL 
      fin1: 
       cmp index2,L1 
       JL sort2 
       JNL sort1 

    mov ax, 4C00h 
int 21h 
code ends 
end start 

的問題是,當我渦輪調試編譯它,它會提示錯誤「不能添加相對數量「(準確的說是22,28,32,33,34,35行)

爲什麼會出現此錯誤提示以及如何解決問題,謝謝!


+0

幾次有你正在嘗試使用一種不存在的尋址形式。從內存中讀取值作爲地址計算的一部分甚至不可能接近。 – harold

+0

*「幾個月前」* ..更像*「just」*開始。無論如何,所以開始時,先閱讀一些理論,然後再次嘗試編程。在目前的水平上,你不能用asm編程,只是猜測,如果你對combinatorics有什麼好處,你可以很容易地計算出有多少可能性來填充例如100個字節的隨機指令,它有可能作爲你想要的是零。你如何使用turbo調試器進行編譯?我知道如何在調試器中覆蓋一些代碼時編譯單條指令,但從未看到它編譯整個源代碼,因爲使用了Turbo Assembler。 – Ped7g

+0

國際海事組織這個最近的問題和答案可以給你一些見解,重點在哪裏:http://stackoverflow.com/q/40719027/4271923(它不是重複的,但答案可能會填補你現在有很多空白)。 – Ped7g

回答

0

在解決問題的方法是使用索引寄存器SIDI而不是變量,例如(複製粘貼來測試它):

.model small 
.stack 100h 
.data 
    S1 db 3, 1, 9, 7, 8, 6, 4, 5 ;given string 
    L1 EQU $-S1 
.code 
    start: 

    mov AX,@data 
    mov DS,AX 

    mov si, offset S1  ;◄■■ INSTEAD OF INDEX1. 
    sort1: 
     mov di, si   ;◄■■ INSTEAD OF INDEX2.    
     inc di    ;◄■■ DI = SI+1. 
     sort2: 
      mov AL, [si] 
      mov AH, [di] 
      cmp AL, AH 
      jng fin1  
      switch: 
       mov [si],AH 
       mov [di],AL 
      fin1:  
      inc di 
      cmp di, L1  ;◄■■ LAST ITEM. 
      jbe sort2  ;◄■■ IF DI <= LAST ITEM 
     inc si 
     cmp si, l1-1   ;◄■■ LAST-1 ITEM. 
     jbe sort1   ;◄■■ IF SI <= LAST-1 ITEM 

    mov ax, 4C00h 
    int 21h 
code ends 
end start 
+0

我不明白爲什麼您已經移除了'L1 EQU $ -S1'並且硬編碼了長度。另外,你有'jg switch'的方式很奇怪; jmp fin1;開關:'當'fin1'會做。 –

+0

@WeatherVane,我把它看作比最終解決方案更多的建議,但你的推薦是有效的,所以他們已經被應用(謝謝)。 –