程序集rep movsw移动超过指示

时间:2014-02-27 13:28:48

标签: assembly x86 masm masm32

我在ecx中为rep movsw设置了600,当它为excutes时,它会移动616个字节。 这个特殊代码表示。

我错过了什么?

在代码之后,我包括两个Pdump来显示移动的结果。 第一个是原点,第二个是目的地。

            ; This program reads the contents of "E:\RaamSoft\SICBdata\SICBCONS201401.SLD" and
            ; outputs it to a File.

             .486

             include \masm32\include\masm32rt.inc
             include \masm32\include\debug.inc
             includelib \masm32\lib\debug.lib

            ; ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

            .Const
             RegFecSz   equ 638
             NxtRgFx    equ 82
             MEMORYSIZE equ 65536
            ; This is how much memory we'll allocate for Work Area.

            .Data?
            RetCode   DWord    ?
            hFout     HANDLE   ?
            hFfin     HANDLE   ?
            hMemory   HANDLE   ?
            pMemory   DWord    ?
            ReadSize  DWord    ?
            ; l for Lengths; h for Handle & p for Pointer of Work Areas
            lFFin     DWord    ?
            pFfin     DWord    ?
            lRfin     DWord    ?
            lRfin2    DWORD    ?
            pFfin2    DWord    ?
            lWout     DWORD    ?
            pFout     DWord    ?
            lFilefin  DWORD    ?
            bWrt      DWORD    ?
            hRegFin   HANDLE   ?
            pRegFin   DWord    ?
            NxtRegSz  DWord    ?
            pWrkDCT   DWord    ?
            pDeCmp    DWord    ?
            pInAcs    DWord    ?
            pOutQW    DWord    ?
            pOutBCD   DWord    ?
            pOutDsp   DWord    ?
            pWrkCte   DWord    ?
            RetCod    DWORD    ?
            ; Wrk DecDsply Sign +/- 18dig sep ; total 20 * 45 * 3 + 20 * 30 * 3 = 2700 + 1800 = 45
            ; Wrk BCD xDia 1350  xMes 900 = 2250 + 10
            ; Wrk QWORD xDia 1080  xMes 720 = 1800 + 8
            ; Tab Fec ddmmaa * (30 + 45) + SldCnt = 450 + 1

            ; Total = 10039 + 1 -> QW @ 0; TBYTE @ 1808; UNPK @ 4068; TabFec @ 8588

            .Data
            Outfle   DB "E:\RaamSoft\SICBdata\testit.dat", 0
            TabFec    Byte     800 Dup (0)

            ; Outfle   DB "C:\RaamSoft\SICBmfdata\testit.dat", 0
            OutfleSz DWord 10040
            FileName DB "E:\RaamSoft\SICBdata\SICBCONS201401.SLD", 0
            ; FileName DB "C:\RaamSoft\SICBmf\data\SICBCONS201310.SLD", 0
            TabFmes  Word 3331H, 3331H, 3238H, 3331H, 3330H, 3331H, 3330H, 3331H, 3331H, 3330H
             ;             Oct,  Ene,   Feb,   Mar,   Abr,   May,   Jun,   Jul,   Ago,   Sep
            HelloWorld DB "Hello This is the test of SICB-io!", 0
            Yalei DB "Hello Ya Lei!", 0
            YaArmeFec DB "Hello, ya arme las fechas!", 0
            YaGrabeLog DB "Hello, Ya grabe LOG!", 0
            HelpMem DB "Ya obtuve MEMORIA",0
            Signal1 WORD 0

            .Code
            start:
            ;*******
                push esi
                Push Edi
                Push Eax
                push ebx
                push ecx
                push edx ; save 6 wrk-regs

                invoke MessageBox, NULL, addr HelloWorld, addr HelloWorld, MB_OK

            ; Get Wrkarea.
             Invoke   GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMORYSIZE
             mov      hMemory, eax          ; Set Handle of WrkArea
             Invoke   GlobalLock, hMemory
             mov      pMemory, eax          ; Set Addr of WrkArea (See details above)
             add      eax,    10040
             mov      pFfin,  eax    ; Input Area1 max Lnght 2560
             add      eax,    2560
             mov      pFfin2, eax   ; Input Area2 Max Lng 2560
             add      eax,    2560
             mov      pWrkDCT, eax  ; DeCmpWrk Area (256)
            ; invoke    MessageBox, NULL, addr HelpMem, addr HelpMem, MB_OK

            ; Get File
             mov      hFfin,    fopen(addr FileName)
             mov      lFilefin, fsize(hFfin)
             mov      lRfin,    fread(hFfin,pFfin,722)
             DumpMem  pFfin, 722, "RegFecIn"

            ; invoke MessageBox, NULL, pFfin, addr Yalei,  MB_OK

            ; SetUp Dates

以下是REP MOVSW的实际设置:

              Mov     Esi, pFfin
              Add Esi, 26              ; Start Fecs
            ; mov   edi,    pMemory
            ; add   edi,    8588            ; start fecs
              lea   edi,    TabFec
              Mov Ecx, 600             ; 45 + 30 mas fecha y hora generado
              cld
              Rep Movsw

这里结束了:

              Mov Ebx, pFfin
              Mov Al, [Ebx + 24]                ; Sld Cnt

              Mov TabFec + 612, Al
              DumpMem Addr TabFec, 616, "Fec2 Cte"

              Jmp Final
             ; *************

            Final:
            ;*******
            ; GlobalFree (hMemory)
             pop  edx                  ;push esi
             pop  ecx                  ;Push Edi
             pop  ebx                  ;Push Eax
             pop  eax                  ;push ebx
             pop  edi                  ;push ecx
             pop  esi                  ;push edx ; save 6 wrk-regs

                    Ret
            End start

DeBug Dump:

      RegFecIn (TestIOsicb2.asm, 99)
      0029EFE8 : 31 39 31 30 - 30 30 30 30 - 30 30 30 30 - 30 30 30 30
      0029EFF8 : 30 30 30 30 - 30 30 02 66 - 2C 38 64 30 - 30 31 31 32
      0029F008 : 31 33 65 30 - 30 32 31 32 - 31 33 66 30 - 30 33 31 32
      0029F018 : 31 33 67 30 - 30 34 31 32 - 31 33 68 30 - 30 35 31 32
      0029F028 : 31 33 69 30 - 30 36 31 32 - 31 33 6C 30 - 30 39 31 32
      0029F038 : 31 33 6D 30 - 31 30 31 32 - 31 33 6E 30 - 31 31 31 32
      0029F048 : 31 33 6F 30 - 31 32 31 32 - 31 33 70 30 - 31 33 31 32
      0029F058 : 31 33 73 30 - 31 36 31 32 - 31 33 74 30 - 31 37 31 32
      0029F068 : 31 33 75 30 - 31 38 31 32 - 31 33 76 30 - 31 39 31 32
      0029F078 : 31 33 77 30 - 32 30 31 32 - 31 33 7A 30 - 32 33 31 32
      0029F088 : 31 33 7D 30 - 32 36 31 32 - 31 33 7E 30 - 32 37 31 32
      0029F098 : 31 33 81 30 - 33 30 31 32 - 31 33 82 30 - 33 31 31 32
      0029F0A8 : 31 33 83 30 - 30 31 30 31 - 31 34 84 30 - 30 32 30 31
      0029F0B8 : 31 34 85 30 - 30 33 30 31 - 31 34 88 30 - 30 36 30 31
      0029F0C8 : 31 34 89 30 - 30 37 30 31 - 31 34 8A 30 - 30 38 30 31
      0029F0D8 : 31 34 8B 30 - 30 39 30 31 - 31 34 8C 30 - 31 30 30 31
      0029F0E8 : 31 34 8F 30 - 31 33 30 31 - 31 34 90 30 - 31 34 30 31
      0029F0F8 : 31 34 91 30 - 31 35 30 31 - 31 34 92 30 - 31 36 30 31
      0029F108 : 31 34 93 30 - 31 37 30 31 - 31 34 96 30 - 32 30 30 31
      0029F118 : 31 34 97 30 - 32 31 30 31 - 31 34 98 30 - 32 32 30 31
      0029F128 : 31 34 99 30 - 32 33 30 31 - 31 34 9A 30 - 32 34 30 31
      0029F138 : 31 34 9D 30 - 32 37 30 31 - 31 34 9E 30 - 32 38 30 31
      0029F148 : 31 34 9F 30 - 32 39 30 31 - 31 34 A0 30 - 33 30 30 31
      0029F158 : 31 34 A1 30 - 33 31 30 31 - 31 34 37 25 - 33 31 30 31
      0029F168 : 30 36 0F 2D - 30 31 30 38 - 31 31 2E 2D - 30 31 30 39
      0029F178 : 31 31 4C 2D - 30 31 31 30 - 31 31 6B 2D - 30 31 31 31
      0029F188 : 31 31 89 2D - 30 31 31 32 - 31 31 A8 2D - 30 31 30 31
      0029F198 : 31 32 C7 2D - 30 31 30 32 - 31 32 E4 2D - 30 31 30 33
      0029F1A8 : 31 32 03 2E - 30 31 30 34 - 31 32 21 2E - 30 31 30 35
      0029F1B8 : 31 32 40 2E - 30 31 30 36 - 31 32 5E 2E - 30 31 30 37
      0029F1C8 : 31 32 7D 2E - 30 31 30 38 - 31 32 9C 2E - 30 31 30 39
      0029F1D8 : 31 32 BA 2E - 30 31 31 30 - 31 32 D9 2E - 30 31 31 31
      0029F1E8 : 31 32 F7 2E - 30 31 31 32 - 31 32 16 2F - 30 31 30 31
      0029F1F8 : 31 33 35 2F - 30 31 30 32 - 31 33 51 2F - 30 31 30 33
      0029F208 : 31 33 70 2F - 30 31 30 34 - 31 33 8E 2F - 30 31 30 35
      0029F218 : 31 33 AD 2F - 30 31 30 36 - 31 33 CB 2F - 30 31 30 37
      0029F228 : 31 33 EA 2F - 30 31 30 38 - 31 33 09 30 - 30 31 30 39
      0029F238 : 31 33 27 30 - 30 31 31 30 - 31 33 46 30 - 30 31 31 31
      0029F248 : 31 33 64 30 - 30 31 31 32 - 31 33 83 30 - 30 31 30 31
      0029F258 : 31 34 30 31 - 30 32 31 34 - 30 37 31 32 - 35 35 31 39
      0029F268 : 31 31 39 31 - 30 31 30 30 - 33 30 30 30 - 30 34 30 30
      0029F278 : 30 30 30 31 - 06 B4 EF FE - FF EF BE FF - EF FE FF EF
      0029F288 : FE FB FF FE - FF FF BF FF - EF BE FF FF - FC 3F FF FF
      0029F298 : FF FF FF FF - FF FF FC 03 - FF FF FF FF - FF FF FF FF
      0029F2A8 : FF FF FF FF - FF FF FF FD - 7F FF FF FF - FF FC 3C C8
      0029F2B8 : 39 23 00 00 - 00 00 00 00 - 00 00 00 00 - 00 00 00 00
      00000722 : BYTES TOTAL

      00404020 : 64 30 30 31 - 31 32 31 33 - 65 30 30 32 - 31 32 31 33
      00404030 : 66 30 30 33 - 31 32 31 33 - 67 30 30 34 - 31 32 31 33
      00404040 : 68 30 30 35 - 31 32 31 33 - 69 30 30 36 - 31 32 31 33
      00404050 : 6C 30 30 39 - 31 32 31 33 - 6D 30 31 30 - 31 32 31 33
      00404060 : 6E 30 31 31 - 31 32 31 33 - 6F 30 31 32 - 31 32 31 33
      00404070 : 70 30 31 33 - 31 32 31 33 - 73 30 31 36 - 31 32 31 33
      00404080 : 74 30 31 37 - 31 32 31 33 - 75 30 31 38 - 31 32 31 33
      00404090 : 76 30 31 39 - 31 32 31 33 - 77 30 32 30 - 31 32 31 33
      004040A0 : 7A 30 32 33 - 31 32 31 33 - 7D 30 32 36 - 31 32 31 33
      004040B0 : 7E 30 32 37 - 31 32 31 33 - 81 30 33 30 - 31 32 31 33
      004040C0 : 82 30 33 31 - 31 32 31 33 - 83 30 30 31 - 30 31 31 34
      004040D0 : 84 30 30 32 - 30 31 31 34 - 85 30 30 33 - 30 31 31 34
      004040E0 : 88 30 30 36 - 30 31 31 34 - 89 30 30 37 - 30 31 31 34
      004040F0 : 8A 30 30 38 - 30 31 31 34 - 8B 30 30 39 - 30 31 31 34
      00404100 : 8C 30 31 30 - 30 31 31 34 - 8F 30 31 33 - 30 31 31 34
      00404110 : 90 30 31 34 - 30 31 31 34 - 91 30 31 35 - 30 31 31 34
      00404120 : 92 30 31 36 - 30 31 31 34 - 93 30 31 37 - 30 31 31 34
      00404130 : 96 30 32 30 - 30 31 31 34 - 97 30 32 31 - 30 31 31 34
      00404140 : 98 30 32 32 - 30 31 31 34 - 99 30 32 33 - 30 31 31 34
      00404150 : 9A 30 32 34 - 30 31 31 34 - 9D 30 32 37 - 30 31 31 34
      00404160 : 9E 30 32 38 - 30 31 31 34 - 9F 30 32 39 - 30 31 31 34
      00404170 : A0 30 33 30 - 30 31 31 34 - A1 30 33 31 - 30 31 31 34
      00404180 : 37 25 33 31 - 30 31 30 36 - 0F 2D 30 31 - 30 38 31 31
      00404190 : 2E 2D 30 31 - 30 39 31 31 - 4C 2D 30 31 - 31 30 31 31
      004041A0 : 6B 2D 30 31 - 31 31 31 31 - 89 2D 30 31 - 31 32 31 31
      004041B0 : A8 2D 30 31 - 30 31 31 32 - C7 2D 30 31 - 30 32 31 32
      004041C0 : E4 2D 30 31 - 30 33 31 32 - 03 2E 30 31 - 30 34 31 32
      004041D0 : 21 2E 30 31 - 30 35 31 32 - 40 2E 30 31 - 30 36 31 32
      004041E0 : 5E 2E 30 31 - 30 37 31 32 - 7D 2E 30 31 - 30 38 31 32
      004041F0 : 9C 2E 30 31 - 30 39 31 32 - BA 2E 30 31 - 31 30 31 32
      00404200 : D9 2E 30 31 - 31 31 31 32 - F7 2E 30 31 - 31 32 31 32
      00404210 : 16 2F 30 31 - 30 31 31 33 - 35 2F 30 31 - 30 32 31 33
      00404220 : 51 2F 30 31 - 30 33 31 33 - 70 2F 30 31 - 30 34 31 33
      00404230 : 8E 2F 30 31 - 30 35 31 33 - AD 2F 30 31 - 30 36 31 33
      00404240 : CB 2F 30 31 - 30 37 31 33 - EA 2F 30 31 - 30 38 31 33
      00404250 : 09 30 30 31 - 30 39 31 33 - 27 30 30 31 - 31 30 31 33
      00404260 : 46 30 30 31 - 31 31 31 33 - 64 30 30 31 - 31 32 31 33
      00404270 : 83 30 30 31 - 30 31 31 34 - 30 31 30 32 - 31 34 30 37
      00404280 : 31 32 35 35 - 2C 39 31 31 - 00 00 00 00 - 00 00 00 00
      00000616 : BYTES TOTAL

1 个答案:

答案 0 :(得分:5)

  

我在ecx中为rep movsw设置600,当它执行时它会移动616个字节。这个特殊代码表示。

我希望它移动1200字节(600 * sizeof(word))。您在ecx中输入的值是重复次数,而不是字节数。