0

私は dosbox を使用していますが、これは課題です。スタックを使用して文字列を逆にする必要があります。私の考えは、文字列を一度に 1 文字ずつスタックにプッシュしてから、RevString に 1 つずつポップアウトすることでした。私は実際にこれを行う方法を理解することはできません。これが私がこれまでに持っているものです。

.MODEL SMALL
.STACK 100h

.DATA

String      DB  "NAJAFI", 13, 10, "$"
RevString   DB  6 DUP(?), '.', 13, 10, "$"

.CODE

Main PROC

    ;; Set up ds register to point to the data
    mov ax, @data
    mov ds, ax

    ;; printing a string in dos
    mov dx, OFFSET String
    mov ah, 9h
    int 21h

    ;; reverse the string by using the stack
    mov ax, WORD PTR String
    push ax
    pop ax
    ;mov RevString, ax


    ;; print the reverse string in dos
    mov dx, RevString
    mov ah, 9h
    int 21h

    ;; DOS return
    mov al, 0
    mov ah, 4ch
    int 21h

Main ENDP
END Main
4

6 に答える 6

0

私の知る限り、バイトをスタックにプッシュすることはできません。ワードとダブルワードのみです。ここにアイデアがあります: 文字列を取得し、手順を使用して文字列の長さを計算し、文字列をスタックにプッシュし、文字列の長さ-1 を EBP に追加します (つまり、EBP のすぐ上に文字列がある場合、それ以外の場合はそれに応じて操作します)。これで、文字列の末尾がポイントされます。これで、EBP を使用して最後の文字を取得し、次に 1 ずつ減らして、文字ごとに取得を続けることができます。

于 2013-05-15T17:32:55.353 に答える
0

80x86 の場合、スタックは 2 バイト、4 バイト、または 8 バイトの境界で整列されます (16 ビットの場合は 2 バイトの整列)。バイトをプッシュすると、CPU は自動的にパディングを追加してアライメントを確保します。

それを回避するには、代わりに単語をプッシュできます。例えば:

lodsw      ;ax = next pair of bytes
rol ax,8   ;Swap the bytes
push ax    ;Store the bytes

これに関する問題は、「文字列の終わり」の検出と処理が面倒になることです.(あなたの場合)$文字がALまたはAH(文字列の文字数が奇数か偶数かによって異なります)になる可能性があるためです.

もちろん、いくつかの代替手段があります。1 つ目は、反転された文字列をパディング付きでスタックに格納し、パディングを削除しながら別の場所にコピーすることです。

もう 1 つの方法は、スタックに十分なスペースを確保し (たとえば、 から値を減算するSP)、通常のMOV命令を使用して (を使用せずにPUSH) 予約したスペースに反転文字列を作成することです。

于 2013-05-15T04:10:12.173 に答える
0

何が起こっているのかわからない場合、文字列の処理も複雑すぎます

境界のあるデータ ブロックを作成して、物事を簡単かつ動的にする

.start
db  "NAJAFI"
.end

mov edx,end-start ;a nice and simple string length
mov ebx,start     ;a nice and simple string start point
mov ecx,0

.loadstack
mov eax,[ebx]
push eax
inc ecx
cmp ecx,edx
jz printsetup
inc ebx
jmp loadstack

.printsetup
mov ecx,0

.printstackbackwards
pop eax
[PRINT IT OUT BIT]
inc ecx
cmp ecx,edx
jnz printstackbackwards

end
于 2013-05-15T08:03:52.047 に答える
0

試してみたかったので、これが私のバージョンです。これが最適化できるかどうかは考えています。

;**********************************************
;
; Reverse a string using the stack.
; EAX is the pointer to the C string.
ReverseWithStack proc


    mov esi, eax
    mov edi, eax

_push_loop:
    mov al, [esi]
    cmp al, 0
    jz _pop_loop

    push ax
    inc esi
    jmp _push_loop

_pop_loop:
    mov al, [edi]
    cmp al, 0
    jz _done

    pop ax
    mov [edi], al
    inc edi
    jmp _push_loop

_done:

    ret

ReverseWithStack ENDP
于 2013-05-15T17:21:01.377 に答える
-2

You don't reverse the string, the stack does it for you

String DB "NAJAFI"

is pushed on like:

I <---first pop

F

A

J

A

N <--First push: stack pointer+2(or4)

So when you pop it you simply pop straight to a print function and it's reversed.

Magic !

于 2013-05-14T22:35:38.447 に答える