diff options
Diffstat (limited to 'src/arch/arm/v7/opdefs/str_A88203.d')
| -rw-r--r-- | src/arch/arm/v7/opdefs/str_A88203.d | 121 | 
1 files changed, 42 insertions, 79 deletions
| diff --git a/src/arch/arm/v7/opdefs/str_A88203.d b/src/arch/arm/v7/opdefs/str_A88203.d index 2952e1a..e3feaf7 100644 --- a/src/arch/arm/v7/opdefs/str_A88203.d +++ b/src/arch/arm/v7/opdefs/str_A88203.d @@ -2,7 +2,7 @@  /* Chrysalide - Outil d'analyse de fichiers binaires   * ##FILE## - traduction d'instructions ARMv7   * - * Copyright (C) 2014 Cyrille Bagard + * Copyright (C) 2015 Cyrille Bagard   *   *  This file is part of Chrysalide.   * @@ -23,113 +23,76 @@  @title STR (immediate, Thumb) -@encoding(t1) { +@desc Store Register (immediate) calculates an address from a base register value and an immediate offset, and stores a word from a register to memory. It can use offset, post-indexed, or pre-indexed addressing. For information about memory accesses see Memory accesses on page A8-294. -    @half 0 1 1 0 0 imm5(5) Rn(3) Rt(3) +@encoding (t1) { -    @syntax <Rgt> <access> +	@half 0 1 1 0 0 imm5(5) Rn(3) Rt(3) -    @conv { +	@syntax <reg_T> <mem_access> -        Rgt = Register(Rt) -        Rgn = Register(Rn) -        imm32 = ZeroExtend(imm5:'00', 7, 32); -        access = MakeMemoryAccess(Rgn, imm32, 1, 0) +	@conv { -    } +		reg_T = Register(Rt) +		reg_N = Register(Rn) +		imm32 = ZeroExtend(imm5:'00', 32) +		mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false) -} - -@encoding(t2) { - -    @half 1 0 0 1 0 Rt(3) imm8(8) - -    @syntax <Rgt> <access> - -    @conv { - -        Rgt = Register(Rt) -        Sp = Register(13) -        imm32 = ZeroExtend(imm8:'00', 10, 32); -        access = MakeMemoryAccess(Sp, imm32, 1, 0) - -    } +	}  } -@encoding(T3) { - -    @word 1 1 1 1 1 0 0 0 1 1 0 0 Rn(4) Rt(4) imm12(12) - -    @syntax "str.W" <Rgt> <access> +@encoding (t2) { -    @conv { +	@half 1 0 0 1 0 Rt(3) imm8(8) -        Rgt = Register(Rt) -        Rgn = Register(Rn) -        imm32 = ZeroExtend(imm12, 12, 32); -        access = MakeMemoryAccess(Rgn, imm32, 1, 0) +	@syntax <reg_T> <mem_access> -    } +	@conv { -    @rules { +		reg_T = Register(Rt) +		imm32 = ZeroExtend(imm8:'00', 32) +		SP = Register(13) +		mem_access = MakeMemoryAccess(SP, imm32, NULL, true, true, false) -        //if Rn == '1111' then UNDEFINED; -        //if t == 15 then UNPREDICTABLE; - -    } +	}  } -@encoding(T41) { - -    @word 1 1 1 1 1 0 0 0 0 1 0 0 Rn(4) Rt(4) 1 1 U(1) W(1) imm8(8) - -    @syntax <Rgt> <access> - -    @conv { +@encoding (T3) { -        Rgt = Register(Rt) -        Rgn = Register(Rn) -        imm32 = ZeroExtend(imm8, 8, 32); -        access = MakeMemoryAccess(Rgn, imm32, U, W) +	@word 1 1 1 1 1 0 0 0 1 1 0 0 Rn(4) Rt(4) imm12(12) -    } +	@syntax ".W" <reg_T> <mem_access> -    @rules { +	@conv { -        //if P == '1' && U == '1' && W == '0' then SEE STRT; -        //if Rn == '1101' && P == '1' && U == '0' && W == '1' && imm8 == '00000100' then SEE PUSH; -        //if Rn == '1111' || (P == '0' && W == '0') then UNDEFINED; -        //if t == 15 || (wback && n == t) then UNPREDICTABLE; +		reg_T = Register(Rt) +		reg_N = Register(Rn) +		imm32 = ZeroExtend(imm12, 32) +		mem_access = MakeMemoryAccess(reg_N, imm32, NULL, true, true, false) -    } +	}  } -@encoding(T42) { +@encoding (T4) { -    @word 1 1 1 1 1 0 0 0 0 1 0 0 Rn(4) Rt(4) 1 0 U(1) W(1) imm8(8) +	@word 1 1 1 1 1 0 0 0 0 1 0 0 Rn(4) Rt(4) 1 P(1) U(1) W(1) imm8(8) -    @syntax <Rgt> <base> <offset> +	@syntax <reg_T> <mem_access> -    @conv { +	@conv { -        Rgt = Register(Rt) -        Rgn = Register(Rn) -        imm32 = ZeroExtend(imm8, 8, 32); -        base = MakeMemoryNotIndexed(Rgn, W) -        offset = MakeAccessOffset(U, imm32) +		reg_T = Register(Rt) +		reg_N = Register(Rn) +		imm32 = ZeroExtend(imm8, 32) +		index = (P == '1') +		add = (U == '1') +		wback = (W == '1') +		mem_access = MakeMemoryAccess(reg_N, imm32, NULL, index, add, wback) -    } - -    @rules { - -        //if P == '1' && U == '1' && W == '0' then SEE STRT; -        //if Rn == '1101' && P == '1' && U == '0' && W == '1' && imm8 == '00000100' then SEE PUSH; -        //if Rn == '1111' || (P == '0' && W == '0') then UNDEFINED; -        //if t == 15 || (wback && n == t) then UNPREDICTABLE; - -    } +	}  } + | 
