2016-11-17 8 views
0

現在登​​録している値EAXを配列に配置する方法がわかりません。アセンブリにMASM32の配列に値を挿入する

このプログラムの基本的な機能は、日付配列を取り出して一意の数値に変換し、それらをBubbleSortして元に戻すことです。

「datetonum」で見つけた値をEAXに入れて、見つけた値を配列raに保存したいと思います。

私は何かをする方法を理解できないようです。
かなりシンプルであるようですね。

ありがとうございます!

include \masm32\include\masm32rt.inc 
.data 
    dates BYTE "23-JUL-2010", 0, "23-JAN-2010", 0, "23-JUL-2009", 0, "31-JUL-2012", 0, "05-MAR-2010", 0 
    months BYTE "JAN",0,"FEB",0,"MAR",0,"APR",0,"MAY",0,"JUN",0,"JUL",0,"AUG",0,"SEP",0,"OCT",0,"NOV",0,"DEC",0 
    nDates DWORD 4 
    ra  DWORD 1,0,0,0,0 

.code 
start: 
    lea EAX, dates  ; create pointer to beginning of dates array 
    push EAX 
    call datetonum 

    ;------------------- 
    ;put value currently in EAX into array to be sorted 
    ;------------------- 
    print "Array to be sorted contents: " 
    print chr$(13,10) 


    lea ECX, ra 
    mov [ECX + nDates], EAX 
    print ra 
    print chr$(13,10) 

ここdatetonum機能

;param1 (date string) = address of 12 byte date 
datetonum: 
    enter 4, 0     ; [EBP - 4] holds 4 byte temp variable 
    mov EBX, [EBP + 8]   ; pointer to entire date string 
    lea ESI, [EBX]    ; pointing to day part of date 
    lea EDI, [EBP - 4]   ; pointing to address of local variable to store day string 
    mov ECX, 2 
    cld 
    rep movsb 
    mov EDX, 0 
    mov [EDI], EDX    ; add null terminator 

    lea EDX, [EBP - 4] 
    mov EAX, sval(EDX)   ; convert day string to int 
    push EAX      ; push EAX to stack 


    ; extract month from date 
    lea ESI, [EBX + 3]   ; pointing to month part of date 
    lea EDI, [EBP - 4]   ; pointing to address of local variable to store month string 
    mov ECX, 3 
    cld 
    rep movsb 
    mov EDX, 0 
    mov [EDI], EDX    ; add null terminator 



    ; debug print of month string 
    pushad 
    lea EDX, [EBP - 4] 
    print EDX 
    print chr$(9)     ; print a tab character 
    print chr$(13,10) 
    popad 

    ; find month number 
    sub ESI, ESI 
    lea EDX, [EBP - 4] 
    mov EAX, [EDX] 
    mov ECX, 12 
search_top: 
    lea EDX, [months + ESI * 4] 
    mov EBX, [EDX] 
    inc ESI 
    cmp EAX, EBX 
    loopne search_top 

    mov EDX, ESI     ; result is in ESI 

    pop EAX       ; pop EAX off the stack 
    mov AH, DL      ; copy the month int into AH 
    push EAX      ; push EAX to stack 

    ; convert year chars to 2 byte int 
    mov EBX, [EBP + 8] 
    lea ESI, [EBX + 7]    ; pointing to year part of date 
    lea EDI, [EBP - 4]    ; pointing to address of local variable to store year string 
    mov ECX, 4 
    cld 
    rep movsb 
    mov EDX, 0 
    mov [EDI], EDX     ; add null terminator 

    lea EDX, [EBP - 4] 
    mov EDX, sval(EDX)    ; convert year string to int 

    pop EAX       ; pop EAX off the stack 
    mov EBX, EAX     ; copy EAX (contains month in AH and day in AL) to EBX 
    mov EAX, EDX     ; copy year to EAX 
    shl EAX, 16      ; shift the year over to high 16 bits in EAX 
    mov AX, BX      ; copy the month and day into low 16 bits in EAX 

    ;print EAX ; this crashes the proc 
    print str$(EAX) 
    print chr$(13,10) 

    leave 
    ret 4 
    exit 
+0

? –

+0

@JoseManuelAbarcaRodríguez私はそれを含めることができます - しかし、私がしようとしていることを達成するために見る必要があることを知らない。日付から日付のうちの1つをユニークな32ビット番号に変換してEAXに保存します – tay1392

+1

まあ、[MCVE](http:// stackoverflow)のためにそのコードをあなたの質問に含める必要があります.com/help/mcve)。私は非常にそれを提案するだろう。 – zx485

答えて

0

あなたの日付を配列に格納され、そしてあなたが数値に変換日付を格納するために別の配列を使用したい場合は、少なくとも1つのループが必要になりますです。インデックスレジスタ(ESI、EDI)を使用して両方の配列を指し、一方のレジスタを使用して値を一方の配列から読み込み、もう一方のレジスタを使用して値を他方の配列に読み込むことができます。

のは、すでに次の3つの手順を持っている想像してみましょう:

  • num2dateは:バック日付(datetonumの反対側)にEAXでNUMを変換します。この日付は、変数dateに格納され、date BYTE "DD-MMM-AAAA"のように宣言されています。
  • bubble_sort:配列番号をraにソートします。
  • transfer_date:変数dateの11バイトをとり、ESIESIは配列datesのどこかを指しています)が指す位置に移動します。

これはあなたのコードのロジックが考えられます。

`datetonum`のコードがある
start: 
;▼ NEXT LOOP CONVERTS ALL DATES TO NUMBERS ▼ 
    lea ESI, dates  ;POINTER TO ARRAY "DATES". 
    lea EDI, ra   ;POINTER TO ARRAY "RA". 
    mov ECX, 5   ;LENGTH OF ARRAY "DATES". 
dates2numbers: 
    push ECX ESI EDI ;PRESERVE REGISTERS. 
    mov EAX, [ESI]  ;CURRENT DATE. 
    push EAX 
    call datetonum  ;CONVERT CURRENT DATE TO A NUMBER. 
    pop EAX   ;GET THE NUMBER. 
    pop EDI ESI ECX ;RESTORE REGISTERS. 
    mov [EDI], EAX  ;STORE NUMBER IN "RA". 
    add ESI, 12  ;NEXT ITEM IN ARRAY "DATES" (12 BYTES EACH). 
    add EDI, 4   ;NEXT ITEM IN ARRAY "RA" (4 BYTES EACH). 
    loop dates2numbers 

    call bubble_sort ;◄■■■ SORT ARRAY "RA". 

;▼ NEXT LOOP CONVERTS ALL NUMBERS TO DATES ▼ 
    lea ESI, dates  ;POINTER TO ARRAY "DATES". 
    lea EDI, ra   ;POINTER TO ARRAY "RA". 
    mov ECX, 5   ;LENGTH OF ARRAY "RA". 
numbers2dates: 
    push ECX ESI EDI ;PRESERVE REGISTERS. 
    mov EAX, [EDI]  ;CURRENT NUMBER. 
    call num2date  ;CONVERTS EAX TO A DATE IN VARIABLE "DATE". 
         ;VARIABLE "DATE" LOOKS LIKE THIS : DATE BYTE "DD-MMM-AAAA" 
         ;"NUM2DATE" SHOULD PRESERVE ESI AND RESTORE IT 
         ;BECAUSE "TRANSFER_DATE" WILL NEED IT. 
    call transfer_date ;TRANSFER CONTENT OF VARIABLE "DATE" INTO THE 
         ;ARRAY "DATES" AT THE POSITION ESI IS POINTING TO. 
    pop EDI ESI ECX ;RESTORE REGISTERS. 
    add ESI, 12  ;NEXT ITEM IN ARRAY "DATES" (12 BYTES EACH). 
    add EDI, 4   ;NEXT ITEM IN ARRAY "RA" (4 BYTES EACH). 
    loop numbers2dates 
+0

'call datetonum' +' pop eax':戻り値が 'eax'にあるので、これは良い考えのようには見えません。また、OPは 'ret 4 'を使って引数をポップしているので、' pop'する必要はありません。 – Ped7g

+0

だから、@ tay1392、私の答えは役に立たない、あまりにも複雑ではないでしょうか?私はそれを説明するために各指示の権利に関するコメントを追加しました。私は、すべての日付を数字に変換し、並べ替え、日付に変換するロジックを教えてもらいました。 –

+1

@JoseManuelAbarcaRodríguezそれは役に立った。私はあなたにそれをする時間を割いていただき、ありがとうございます。本当に私が組み立てに慣れていないという理由だけで少し複雑でした。しかし、あなたのコメントとロジックは理にかなっています。私の仕事がうまくいくことはありませんでしたが、まあまあです。再度、感謝します。 – tay1392

関連する問題