MASM Разыменование указатель Дважды? - PullRequest
0 голосов
/ 21 марта 2019

Прямо и точно, я застрял на части моего кода.В checkdigit proc я пытаюсь переместить значение в соответствующих ячейках памяти в регистры и использую [] для разыменования указателей.Тем не менее, просматривая это, я предполагаю, что вы не можете разыменовать указатель дважды, так как я поместил адреса этих 'varaibles' в стек для использования, и я предполагаю создание другого указателя.Текущий код передает ячейки памяти значений, которые я хочу передать в регистры, однако я не могу разыменовать ячейку памяти, чтобы получить мои значения.Буду признателен за любую помощь, даже если это означает, что я не смогу использовать текущий код.Спасибо.

;valid pin program


 include c:/Irvine/Irvine32.inc

 NULL        EQU  0
CR      EQU 0dh
LF      EQU  0ah
 nextdigit EQU  4

 range     EQU  8[ebp]
 digit     EQU  12[ebp]

.data

 outfile byte   "resultpin.txt", NULL
 infile  byte   "Pin.txt", NULL
 input   dword  ?
 output  dword  ?

 buffer_size = 130

 buffer    byte  buffer_size dup (?), NULL
 bytesread dword ?
 buffpos   dword 0
 pinpos    dword 1

 digitnum  dword 0

 range1    dword     '4', '8', NULL
 range2    dword     '2', '5', NULL
 range3    dword     '5', '9', NULL
 range4    dword     '1', '4', NULL
 range5    dword     '3', '6', NULL

 rangeray  dword     range1, range2, range3, range4, range5, NULL
 rangepos  dword     12                            
;memory offset is 60

 equal     byte      "=", NULL

 great     byte      "PIN is valid", NULL

 fault1    byte     "/Digit position ", NULL
 fault2    byte      "is invalid/", NULL

 faultray  dword     fault1, fault2, NULL          
;memory offset is 29
 faultpos  dword     17

 gap       byte      LF, CR, NULL


.code
main proc

      lea edx, outfile              ;create & open output file
    call CreateOutputFile
    mov output, eax

      lea  esi,infile               ;open input file linkage
      call openfiles

      lea  esi,buffer
      mov  ecx,digitnum
      call countdigits

      call resetregs

      lea  esi,buffer
      lea  edi,rangeray
      add  edi,-60                  ;start at beginning of rangeray
      mov  ecx,digitnum
 L1:
      push esi
      push edi
      push ebp

      call checkdigit
      pop  ebp
      pop  edi
      pop  esi
      loop L1
 main endp

 openfiles proc
      lea edx,[esi]                 ;open file      
    call OpenInputFile
    mov input, eax 

    mov  eax, input               ;read input 
   file
    lea  edx, buffer
    mov  ecx, buffer_size
    call ReadFromFile
    mov  bytesRead, eax
      ret
 openfiles endp

 countdigits proc
   nextnumber:
      mov  dl,[esi]                 ;if not a 
  number bypass inc ecx
      cmp  dl,'0'
      jl   notdigit
      cmp  dl,'9'
      jg   notdigit

      inc ecx

   notdigit:
      inc  esi
      mov  dl,[esi]
      cmp  dl,NULL                  ;if esi 
is NULL then return out of proc
      jne  nextnumber

      mov  digitnum,ecx
      ret
 countdigits endp

 checkdigit proc
      mov  ebp,esp
      mov  ebx,digit
      mov  edx,range
      cmp  ebx,edx
      jl   notvalid
      mov  ebx,0
   notvalid:
      ret
 checkdigit endp

 resetregs proc
      mov  eax,0                    ;reset 
  following registers
      mov  ebx,0
      mov  ecx,0
      mov  edx,0
      mov  dl,0
      mov  al,0
      ret
 resetregs endp


end main
...