0

mainから次のように関数を呼び出します。

 main:
;memory alocation ect
call    encode

エンコード関数は次のようになります。単純なRLEアルゴリズムを実行します。

encode:
;IN eax - pointer a memoria elejere
;IN ecx - sor hossza
;OUT eax -pointer az eredmeny elejere
;OUt ecx -a kiirt sor hossza
;elso char

ここでそれは最初の文字を読みます

;push eax
push ebp
xor ebp,ebp
push esi
push edi
push eax
xor edi,edi

ここでメモリを割り当てます。

;lefoglal memoria eredmenynek
mov ebx,eax
mov eax,ecx
call mem_alloc
;esi legyen eredmeny memoria kezdete
mov esi,eax
mov eax,ebx
;eax ismet a memoria poiter

xor edx,edx
mov dl,[eax]
; push eax
; xor eax,eax
; mov al,dl
; call io_writeint
; call mio_writeln
; pop eax

;lastChar az elso char
mov [lastChar],dl

メインループ「ベクトル」へのループ

inc ebp 
;dec ecx
.goloop:
mov dl,[eax+ebp]
xor ebx,ebx
mov bl,[lastChar]
cmp dl,bl
jne .newChar
xor ebx,ebx
mov bl,[count]
inc bl
mov [count],bl


.backloop:
loop .goloop

.newChar:

mov [esi+edi],bl
inc edi
mov byte[esi+edi],-1
inc edi
mov bl,[count]
mov [esi+edi],bl
inc edi
mov byte[count],0
cmp ecx,0
ja .backloop

.veg:
mov ebx,esi
mov edx,edi 
pop edi
pop esi
pop eax

pop ebp
pop eax
mov eax,ebx
mov ecx,edx 

ret
4

1 に答える 1

1

4 つのレジスタをスタックにプッシュし、5 つのレジスタをポップしたようです。

アドレスを CALL すると、命令ポインターがスタックにプッシュされ、プロセッサは指定したラベル/アドレスに JMP します。RET が実行されると、スタックからポップされ、ポップされたアドレスにジャンプします。RET は、CALL がスタックにプッシュしたアドレスがスタック内の次のワードになることを期待していますが、プッシュしたよりも多くのレジスタをポップした場合、このバイトは既にポップされています。

あなたは最後のものを取ってみることができます

push eax

あなたのコードから。

于 2013-01-12T01:50:30.787 に答える