2016-11-22 10 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

*「数ヶ月前」* ..もっと... *「ちょうど」*始まった。とにかく、始めに、いくつかの理論を読んでから、もう一度プログラミングしてみてください。現在のレベルでは、asmでプログラムすることはできません。ちょうど推測です。もしあなたがコンビナトリアルをうまく利用しているならば、無作為指示で100バイトを埋める可能性がどれくらいあるかを簡単に計算できます。あなたはゼロです。ターボデバッガでどのようにコンパイルしますか?私はデバッガでいくつかのコードを上書きするときにどのように単一の命令をコンパイルすることができるのか知っていますが、Turbo Assemblerが使用されているため、ソース全体をコンパイルすることはできませんでした。 – Ped7g

+0

IMOこの最近の質問と回答は、ここで焦点を当てるべきいくつかの洞察力を与えることができます: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; switch: '' jng fin1'が実行されるときです。 –

+0

@WeatherVane、私はそれを最終的な解決策よりも多く提案しましたが、あなたの勧告は有効であるため、適用されました(ありがとう)。 –

関連する問題