Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 083

Раздел: Ассемблер
/ вопрос открыт /

Приветствую, уважаемые эксперты!
У меня возникла проблема с ассемблером. Требуется написать ввод и вывод чисел, а так же рассчитать некоторую функцию (какую именно - не важно). Программу я написал, но она никак не хочет компилироваться. В чем может быть ошибка? Заранее, спасибо.

фрагмент кода

Приложение:
  1. C:\Masm32\Bin\ML.EXE /c /Cp /nologo /I"C:\Masm32\Include" "lab3.asm"
  2. Assembling: lab3.asm
  3. lab3.asm(159) : fatal error A1010: unmatched block nesting : LAB3_TEXT
  4.  
  5. Make error(s) occured.


IlluminatI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 16 апреля 2012, 23:28
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 18 апреля 2012, 22:52; участников в обсуждении: 2.
SOA

SOA (статус: Посетитель), 17 апреля 2012, 00:45 [#1]:

IlluminatI: попробуйте убрать на 138 строке слово segment, чтоб использовать в коде один стиль объявления сегментов(кода, данных), либо на 157 поставьте Ends, но лучше первый вариант.
Возможно поможет ;-)
IlluminatI

IlluminatI (статус: 2-ой класс), 17 апреля 2012, 00:50 [#2]:

Пробовал, не помогает :(
Добился того, что программа компилируется :) Такой код:
.model Large
 
assume cs:code, ds:data
data segment
    msg_inA  db 'Input A: $'
    msg_inB  db 'Input B: $'
    msg_shR  db 'Result : $'
    new_line db 0Dh, 0Ah,'$'
 
    result   dw ? ;'      $'
    negsign  db '-'
    firstop  dw ?
    secndop  dw ?
 
    param    label byte ; first
    param2    label byte ; second (2)
    maxlen   db 20
    actlen    db ?
    maxlen2  db 20
    actlen2  db ?
    field    db 20 dup(' ')
    field2    db 20 dup(' ')
 
code segment
  org 100h
 
start: jmp main
    digit    dw 0
    mult10   dw 1
 
  main proc near
    ; ввод данных 
    ; ##### First Digit #####
 
    ; сообщение - введите A:
    lea dx, msg_inA
    mov ah, 09h
    int 21h
    ; ввод строки в буфер
    mov ah, 0aH
    lea dx, param
    int 21h
    ; передаём параметры для tonumber
       lea si, field - 1 
       mov bh, 0
       mov bl, actlen
       ; перевод числа 
       call tonubmer
       mov ax, digit
       mov firstop, ax
 
       ; #### Second Digit #####
       mov digit, 0
       mov mult10, 0
       mov ah, 9
       lea dx, new_line
       int 21h
       ; сообщение - введите B
       lea dx, msg_inB
       mov ah, 9
       int 21h
       ; ввод строки в буфер
       mov ah, 0aH
       lea dx, param2
       int 21h
       ; передаем параметры для tonumber
       lea si, field2 - 1
       mov bh, 0
       mov bl, actlen2
       ; перевод числа
       call tonubmer
       mov ax, digit
       mov secndop, ax
 
       ; #################################
       ; вторая лаба:
       mov ax, firstop
      mov bx, secndop
      cmp ax, bx
 
      ; default result
      mov result, -4
 
      jl @alb  ; (a < b)
      jg @agb  ; (a > b)
    jmp @out ; (a == b) => out
 
 
  @alb:      ; (3a - 5)/b
       mov cx, 3
       imul cx
       sub ax, 5
       sbb dx, 0
 
       idiv bx
 
       mov result, ax
    jmp @out
 
    @agb:     ;(a^3 + b)/a
       mov cx, ax
       xor dx, dx
       imul cx
       imul cx
 
       add ax, bx
       adc dx, 0
 
       mov bx, firstop
       cwd
       idiv bx
 
       mov result, ax
    jmp @out
 
  ; вывод результата
    @out:
      mov ax, result
      mov digit, ax
 
      ; преобразуем число в ASCII
      call tostring
 
      ; перевод строки
      mov ax, 09h
      lea dx, new_line
      int 21h
 
      ; выводим сообщение и ответ
      mov ax, 09h
      lea dx, msg_shR
      int 21h
 
      mov ax, 09h
      lea dx, digit
      int 21h
 
      ; завершаем программу
      mov ah, 0ah
       lea dx, param
       int 21h
      mov ax, 4c00h
      int 21h
 
    ret
  main endp
 
  tonubmer proc near
    ;Запишем множитель
     mov cx, 10
 
     ;Организуем цикл
b20:   
    mov al,[si + bx]  ;выписываем ASCII-код очередной цифры
       and ax, 000fh  ;Оставляем само число от ASCII кода
       mul mult10  ;Домножаем его
    add digit, ax
       mov ax, mult10
       mul cx
       mov mult10, ax
       dec bx
      jnz b20
 
    ret
  tonubmer endp
 
  tostring proc near
    mov cx, 0010
       lea si, result + 5
       mov ax, digit
    ;Нужно обработать ситуацию, когда число отрицательное:
    mov bx, ax
    and bx, 8000h  ;Оставляем только знаковый бит
    cmp bx, 8000h  ;Определяем, есть ли еденичка (-) или нет (+)
    jb  plus  ;Еденички нет - число положительное
      ;Если мы здесь, значит число отрицательное
      mov bx, ax
      mov ax, 65535
      sub ax, bx
      add ax, 1
      ;Теперь в AX хранится модуль числа
      mov bx, 1  ;Ставим флаг, что есть минус
plus:
      ;Теперь в AX модуль числа. Переводим его в ASCII строку:
c20:    cmp ax, 0010
             jb c30
             xor dx, dx
             div cx
             or dl, 30h
             mov [si], dl
             dec si
             jmp c20
 
c30:    or al, 30h
       mov [si], al
    ;Проверим нужно ли поставить знак "-"
    cmp bx, 1
    je addminus  ;Знак минус ставить нужно
     ret
addminus:
    dec si
    mov al, negsign
    mov [si], al
 
    ret
  tostring endp
 
code ends
 
stk segment
     db 256 dup (?)
stk ends
 
end start

Но вывод какой-то совсем страшный. Куча ненужных символов, и посреди нужной строки символы пропадают.
SOA

SOA (статус: Посетитель), 17 апреля 2012, 00:53 [#3]:

Так помогло или нет?
P.S. Если объявляешь сегменты с использованием слова segment, то в конце КАЖДОГО сегиента нужно ставить слово Ends.
IlluminatI

IlluminatI (статус: 2-ой класс), 17 апреля 2012, 00:56 [#4]:

Ну, по-крайней мере, стала коспилироваться :) Теперь вопрос в другом - в чем ошибка, и откуда столько мусора..?)
SOA

SOA (статус: Посетитель), 17 апреля 2012, 00:59 [#5]:

А что про ошибку пишет, и что за мусор?
IlluminatI

IlluminatI (статус: 2-ой класс), 17 апреля 2012, 01:02 [#6]:

Ошибок никаких при компиляции и выполнении нет.
При запуске программы, она выдает кучу мусора из символов, перевод строки и, по середине, нужную надпись с пропуском: "In ut: A: ". При вводе чего-либо, выдает такую же точно фигню и завершается без ошибок.
SOA

SOA (статус: Посетитель), 17 апреля 2012, 01:07 [#7]:

Пнятно :/
IlluminatI

IlluminatI (статус: 2-ой класс), 17 апреля 2012, 01:08 [#8]:

Соображений нет?:)
А то я уже все перебрал :/
SOA

SOA (статус: Посетитель), 17 апреля 2012, 10:41 [#9]:

IlluminatI: Если это не критично в данной ситуации, то попробуйте:
1. В директиве .model использовать модель памяти flat
2. В объявлениях прцедур не пишите near
3. при обращении к ячейкам памяти с помощью таких команд как lea
используйте 32 битные регистры.
Как то так.
IlluminatI

IlluminatI (статус: 2-ой класс), 18 апреля 2012, 22:52 [#10]:

Начал сначала. Буду разбираться, спасибо... :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 16:29
Выполнено за 0.04 сек.