web-dev-qa-db-ja.com

アセンブリの複雑なIFステートメント

そのようなifステートメントをアセンブリでどのように記述すればよいですか?

if ((a == b AND a > c) OR c == b) { ...

プラットフォーム:Intel 32ビットマシン、NASM構文。

更新

変数の型と値については、より理解しやすいものを使用してください。整数は私にとってはうまく機能すると思います。

14
user1960660

一般的なアセンブリでは、基本的には次のようなものになります(aaxbbxccx):

    cmp  bx, cx
    jeq  istrue
    cmp  ax, cx
    jle  isfalse
    cmp  ax, bx
    jeq  istrue
isfalse:
    ; do false bit
    jmp  nextinstr
istrue:
    ; do true bit

nextinstr:
    ; carry on

偽ビットがない場合は、次のように簡略化できます。

    cmp  bx, cx
    jeq  istrue
    cmp  ax, bx
    jne  nextinstr
    cmp  ax, cx
    jle  nextinstr
istrue:
    ; do true bit

nextinstr:
    ; carry on
20
paxdiablo

Ifステートメントを一連の比較とジャンプに分割する必要があります。 Cと同じように書くことができます:

int test = 0;

if (a == b) {
  if (a > c) {
    test = 1;
  }
}

// assuming lazy evaluation of or:
if (!test) {
  if (c == b) {
    test = 1;
  }
}

if (test) {
  // whole condition checked out
}

これにより、複雑な表現がasmと同様に構成部分に分割されますが、関連性のある部分にジャンプすることで、asmでよりきれいに記述することができます。

A、b、cがスタックで渡されていると仮定します(明らかに他の場所からロードされていない場合)

        mov     eax, DWORD PTR [ebp+8] 
        cmp     eax, DWORD PTR [ebp+12] ; a == b?
        jne     .SECOND                 ; if it's not then no point trying a > c 
        mov     eax, DWORD PTR [ebp+8]
        cmp     eax, DWORD PTR [ebp+16] ; a > c?
        jg      .BODY                   ; if it is then it's sufficient to pass the
.SECOND:
        mov     eax, DWORD PTR [ebp+16]
        cmp     eax, DWORD PTR [ebp+12] ; second part of condition: c == b?
        jne     .SKIP
.BODY:
        ; .... do stuff here
        jmp     .DONE
.SKIP:
        ; this is your else if you have one
.DONE:
10
Flexo