проблемы с ассемблером (TASM) сравнение - PullRequest
2 голосов
/ 15 марта 2019

У меня проблемы со сравнением двух значений в 64-битной Windows 10 TASM. Я пытаюсь отобразить последние N строк файла (я не включил весь код, но предположил, что обработка файла правильная, могупредоставьте полный код, если это необходимо), поэтому я создал процедуру (READN), которая читает N.'\ n' или

COUNTLINES PROC NEAR

      MOV  AH,3FH         ;read from file function
      MOV  BX,HANDLE      ;load file handle
      LEA  DX,FBUFF       ;set up pointer to data buffer
      MOV  CX,1           ;read one byte
      INT  21H            ;DOS call
      CMP  AX,0           ;were 0 bytes read?
      JZ   EOFF           ;yes, end of file found
      MOV  DL,FBUFF       ;no, load file character
      CMP  DL,1AH         ;is it Control-Z <EOF>?
      JZ   EOFF           ;jump if yes
      CMP  DL,0AH         ;is it \n ?
      JZ   INCR           ;jump if yes
      JMP  COUNTLINES       ;and repeat
      MOV  AH,9           ;display string function
      INT  21H            ;DOS call
      STC                 ;set error flag

EOFF:     inc DS:[LINES]
      XOR AX, AX
      MOV AX, LINES
      ADD AX, '0'
      SUB AX, N
      MOV N, AX
      MOV LINES, 0
      MOV AX, N
      MOV DX, AX
      MOV AH, 2
      INT 21H
      CALL CLOSEFILE
      CALL OPENFILE
      RET

INCR:     INC DS:[LINES]
      JMP COUNTLINES
COUNTLINES ENDP

И, наконец, проблема, с которой я столкнулся, заключается в процедуре DISPLAYLINES, где я снова увеличиваю LINES с нуля, но на этот раз, когда LINES euqals NI начинает печатать строки.Проблема в том, что мое сравнение (в INCREM: part) не работает так, как я ожидал, и когда я пытаюсь сравнить N и LINES (я сначала перемещаю LINES в AX), программа просто никогда не переходит к нужной функции, даже еслизначения должны быть равны в какой-то момент.Если бы вы могли попытаться выяснить, почему это происходит или, возможно, даже предоставить исправление, я был бы очень признателен.

DISPLAYLINES PROC NEAR

      MOV  AH,3FH         ;read from file function
      MOV  BX,HANDLE      ;load file handle
      LEA  DX,FBUFF       ;set up pointer to data buffer
      MOV  CX,1           ;read one byte
      INT  21H            ;DOS call
      CMP  AX,0           ;were 0 bytes read?
      JZ   EOF           ;yes, end of file found
      MOV  DL,FBUFF       ;no, load file character
      CMP  DL,1AH         ;is it Control-Z <EOF>?
      JZ   EOF           ;jump if yes
      CMP  DL,0AH         ;is it \n ?
      JZ   INCREM           ;jump if yes
      JMP  DISPLAYLINES       ;and repeat

EOF:      RET

INCREM:   INC  DS:[LINES]
      MOV  AX, LINES
      CMP  AX, N
      JZ   PRINT
      JMP  DISPLAYLINES

PRINT:    MOV  AH,3FH         ;read from file function
      MOV  BX,HANDLE      ;load file handle
      LEA  DX,FBUFF       ;set up pointer to data buffer
      MOV  CX,1           ;read one byte
      INT  21H            ;DOS call
      CMP  AX,0           ;were 0 bytes read?
      JZ   EOF           ;yes, end of file found
      MOV  DL,FBUFF       ;no, load file character
      CMP  DL,1AH         ;is it Control-Z <EOF>?
      JZ   EOF           ;jump if yes
      MOV  AH,2           ;display character function
      INT  21H            ;DOS call
      JMP  PRINT       ;and repeat
DISPLAYLINES ENDP

Ответы [ 2 ]

1 голос
/ 16 марта 2019

readn

MOV  AH, 1
INT  21H
MOV  N, AX

Эта функция DOS возвращает символ! Вам нужно значение вместо этого. Лучше пиши

MOV  AH, 1
INT  21H
sub  al, '0'
mov  ah, 0
MOV  N, AX

батончики

MOV AX, LINES
ADD AX, '0'
SUB AX, N
MOV N, AX

Здесь ADD AX, '0' был несколько необходим из-за более ранней ошибки. Теперь вы можете просто написать

MOV AX, LINES
SUB AX, N
MOV N, AX

displaylines

Раньше это не удавалось, потому что код readn имел старший байт 1 в переменной N . Это, в свою очередь, привело к появлению очень большого нового N после вышеупомянутого вычитания countlines . Вот почему печать никогда не происходила!
Сделайте оба исправления, и вы увидите, что это больше не подведет ...

0 голосов
/ 16 марта 2019

Если вы добавите директиву IDEAL в начало вашего исходного файла, а затем замените все команды непосредственными значениями явно указанными значениями 'offset' или квадратных скобок - вы решите все свои проблемы. Если, конечно, вы используете Borland Turbo ассемблер.

...