flat assembler
Message board for the users of flat assembler.
![]() |
Author |
|
m3ntal 09 Nov 2014, 08:31
[ARM] ARMVD Visual Disassembler, Interactive Debugger.
Download: ARMVD for X86/Windows Supports most ARMv6/7. Fast & easy to use. No setup or installation. Disassembler engine (INCLUDE\DARM.INC) consists of >5,300+ lines of tightly written syntax with help and descriptions of instructions. 11 stylish, innovative themes: Designed for resolution width 1280W-1920W. To select themes, press Ctrl+LEFT/RIGHT or click theme icon near zoom. Teaches ARM assembler with popup help descriptions of instructions. ![]() ![]() ![]() ![]() SOURCE PREVIEW Identify Instruction Code: if.bits 27-25=011b ; #227, A5-16. if.bit 4 ; media jmp .mi ; instructions end end if.bits 31-27=11110b ; A5.7.1 jmp .misc2 ; miscellaneous 2 end if.bits 27-26=10b ; branch if.bit 25 if.bit 24 ; with link? return I.BL end return I.B end end if.not.bit 25 ; #210, A5-2 if.bits 27-26=0 ; class 0 . op=i,\ op>>>20, op&11001b ; op=not 10xx0 if op<>10000b if.not.bit 4 ; op=xxx0. data jmp .dpr ; processing register end if.not.bit 7 ; op=0xx1. data jmp .dprsr ; processing register end ; shifted register end end if.bits 24-23=10b if.not.bit 20 if.not.bit 7 ; miscellaneous jmp .misc end if.not.bit 4 ; multiply half jmp .mulh end end end if.bits 7-4=1001b if.not.bit 24 ; multiply jmp .mula ; accumulate end jmp .sync ; synchronization end if.not.bit 24 ; op=0xx1x if.bit 21 if.bits 7-4=1011b ; load/store extra jmp .lsu ; unprivileged end if.bits 7-6=11b if.bit 4 jmp .lsu end end end end jmp .ldst ; load/store else ; op=1 . op=i,\ ; data processing op>>>20, op&11111b ; move 16BIT if op=10000b ; immediate if.bit 26 return I.STR end return I.MOVW end if op=10100b if.bit 26 return I.STRB end return I.MOVT end if.bits 24-23=10b ; msr immediate if.bits 21-20=10b ; and hints jmp .msrih end end if.bit 25 ; not 10xx0 if.not.bit 26 jmp .dpi ; data processing end ; immediate end end ; #219, A5.2.7, A5-9 - signed multiply half .mulh: . op=i,\ op>>>21, op&11b if op=0 . op=i,\ op>>>5, op&11b if op=0 return I.SMLABB else.if op=1 return I.SMLATB else.if op=2 return I.SMLABT else.if op=3 return I.SMLATT end else.if op=1 . op=i,\ op>>>5, op&11b if op=0 return I.SMULWB else.if op=1 return I.SMULWT else.if op=2 return I.SMLAWB else.if op=3 return I.SMLAWT end else.if op=2 . op=i,\ op>>>5, op&11b if op=0 return I.SMLALBB else.if op=1 return I.SMLALTB else.if op=2 return I.SMLALBT else.if op=3 return I.SMLALTT end else ; op=3 . op=i,\ op>>>5, op&11b if op=0 return I.SMULBB else.if op=1 return I.SMULTB else.if op=2 return I.SMULBT else.if op=3 return I.SMULTT end end Convert Instruction Code: ; data processing... if.search.table \ dp.tb, id get s=search.n \ ; 2 operands? dp2.tb, id,\ ; mov/cmp/etc dp2.tb.n . r1=i if s=0 jmp @f else.if id=I.MOV jmp @f else.if id=I.MVN @@: . r1>>12 else . r1>>16 end . r1&0Fh put.r r1 ; operand 1 put.cs ; ", " . r0=i if.bit 25 ; immediate? if s=0 ; implicit? . r0=i,\ r0>>16, r0&0Fh ; operand 2 put.r r0 put.cs end . r0=i,\ r1=r0, r1&0FFh,\ n=r1 if r0&0F00h ; constant . r1=r0,\ ; rotation? r1>>8, r1&0Fh,\ r1*2 ; double ror n, cl end if n>=-1 ; -1/0-9 as if n<=9 ; decimal put.n n jmp .r end end put.h n ; h number jmp .r end if s=0 ; operand 2 . r0=i,\ r0>>16, r0&0Fh put.r r0 put.cs ; ", " end . r0=i, r0&0Fh put.r r0 ; operand 3 . r0=i if.not.bit 4 ; shift #i . \ r0=i, r0>>7,\ r0&11111b, n=r0 if false ; #i=0, no jmp .r ; shift. just end ; register put.cs ; ", " . r0=i,\ r0>>5, r0&11b ; shift put.shift r0 ; type put.space put.n n ; #number jmp .r end . \ ; else, shift r0=i, r0>>8,\ ; by register r0&0Fh, n=r0 put.cs ; ", " . r0=i,\ r0>>5, r0&11b ; shift put.shift r0 ; type put.space put.r n ; register jmp .r ; return end ; end dp ; load/store w/b... if.search.table \ ls.tb, id . r0=i, r1=r0,\ r1>>25, not r1, r1&1, imm=r1,\ r1=r0, r1>>24, r1&1, post=r1,\ r1=r0, r1>>23, r1&1, up=r1,\ r1=r0, r1>>21, r1&1, wb=r1,\ r1=r0, r1&0FFFh,\ n=r1 put.rx 12 ; destiny put.cs ; register . testing?=0 if testing? put.c '<' if imm put.c 'i' end if post put.c 'p' end if up put.c 'u' end put.c '>' jmp .r end put.c '[' ; base put.rx 16 ; register if imm if post if up if n=0 ; ipu: ldr r, [r] jmp .ls.ok end ; non-zero offset put.cs ; ldr r, [r, #] put.dh n jmp .ls.ok else ; ip: ldr r, [r, -#] put.cs put.c '-' put.dh n jmp .ls.ok end end end if post ; pu: if up put.cs put.rx 0 . r0=i if.bits 11-8=0 ; pu: ldr r, [r, r] jmp .ls.ok end put.cs ; r, [r, r, sh #] . r0=i,\ r0>>5, r0&11b put.shift r0 put.space . r0=i,\ r0>>7, r0&31 put.n r0 jmp .ls.ok end put.cs ; p: r, [r, -r] put.c '-' put.rx 0 jmp .ls.ok end if up ; u: r, [r], r put.c ']' put.cs if not imm put.rx 0 else put.dh n end jmp .r end put.c ']' ; none? r, [r], -r put.cs put.c '-' if not imm put.rx 0 else put.dh n end jmp .r .ls.ok: put.c ']' if wb put.c '!' end jmp .r end Convert Instructions to English Words/Descriptions Code: ; in function arm.get.help(t, code)... if i=I.NOP describe NO, OPERATION return else.if i=I.BKPT describe BREAKPOINT go .ok else.if i=I.SWI describe INTERRUPT go .ok else.if i=I.MOVW describe MOVE, IMMEDIATE, LOW, 16 go .ok else.if i=I.MOVT describe MOVE, IMMEDIATE, HIGH, 16 go .ok end Code: ; get condition 'text'. example: ; * EQ: 'If Equal', ; * HI: 'If Greater Than Unsigned' ; * LE: 'If Less Or Equal Signed' ; return C.X condition code 0-15. ; if ALWAYS/NEVER, no 'text' is copied ; EQ, NE, HS, LO, MI, PL, VS, VC ; HI, LS, GE, LT, GT, LE, AL, NV function arm.get.c, t, code locals c . r0=code, r0>>>28,\ r0&1111b, c=r0 if c>=C.AL return end descript IF if c=C.EQ describe EQUAL else.if c=C.NE describe NOT, EQUAL else.if c=C.VS describe OVERFLOW else.if c=C.VC describe NOT, OVERFLOW else.if c=C.MI describe MINUS, C, NEGATIVE else.if c=C.LT describe LESS, THAN, SIGNED else.if c=C.LE describe LESS, OR, EQUAL, SIGNED else.if c=C.GT describe GREATER, THAN, SIGNED else.if c=C.GE describe GREATER, OR, EQUAL, SIGNED else.if c=C.LO describe LESS, THAN, UNSIGNED else.if c=C.LS describe LESS, OR, EQUAL, UNSIGNED else.if c=C.HI describe GREATER, THAN, UNSIGNED else.if c=C.HS describe GREATER, OR, EQUAL, UNSIGNED end endf c Code: ;;;;;;;;;;;;;;;;;;;;;; STEP ;;;;;;;;;;;;;;;;;;;;;; ; step; advance start to line # and select function step.to, i . r0=i, [asm.start]=r0, r0-[asm.start] . r1=[asm.n], r1-[asm.visible] if [asm.start]>=r1 . [asm.start]=r1 . r0=[asm.n], r0-- end . [asm.select]=r0 . [asm.select.end]=r0 endf ; is line # breakpoint or function? function is.breakpoint, i locals id get id=get.asm.id i if id=I.BKPT return 1 else.if id=I.STMDB get.asm.code i if.bits 16-19=13 ; stmdb sp!...lr if.bit 14 return 1 end end end endf 0 ; advance to last/left/up or next/right/down ; appearance of breakpoint or function function step.last locals i, s . s=[asm.start], s-- for i=s, i>0, i-- is.breakpoint i if true step.to i return 1 end endl endf 0 function step.next locals i, n, s . n=[asm.n], s=[asm.start], s++ loop i=s to n is.breakpoint i if true step.to i return 1 end endl endf 0 Legal: Any individual has permission to use this strictly for non-profit, personal or educational purposes. If a corporation or software manufacturer is interested in my ideas, please message me. I have sent myself 3 copies of this on DVDs to prove that it's my intellectual property. Last edited by m3ntal on 10 Nov 2014, 17:25; edited 1 time in total |
|||
![]() |
|
m3ntal 11 Nov 2014, 11:53
|
|||
![]() |
|
Picnic 02 Feb 2016, 09:17
Awesome work with the interface m3ntal, it runs nicely on my pc. I use your D-ARM7.
|
|||
![]() |
|
redrum88 30 Mar 2016, 10:22
Wow, the GUI looks nice.
Did you do it in asm or use any other language/lib to do the interface? Congratulations, by the way. |
|||
![]() |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.