|
Вопрос # 6 083/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
У меня возникла проблема с ассемблером. Требуется написать ввод и вывод чисел, а так же рассчитать некоторую функцию (какую именно - не важно). Программу я написал, но она никак не хочет компилироваться. В чем может быть ошибка? Заранее, спасибо.
фрагмент кода
Приложение: Переключить в обычный режим- C:\Masm32\Bin\ML.EXE /c /Cp /nologo /I"C:\Masm32\Include" "lab3.asm"
- Assembling: lab3.asm
- lab3.asm(159) : fatal error A1010: unmatched block nesting : LAB3_TEXT
-
- Make error(s) occured.
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 16 апреля 2012, 23:28
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 10; последнее сообщение — 18 апреля 2012, 22:52; участников в обсуждении: 2.
|
SOA (статус: Посетитель), 17 апреля 2012, 00:45 [#1]:
IlluminatI: попробуйте убрать на 138 строке слово segment, чтоб использовать в коде один стиль объявления сегментов(кода, данных), либо на 157 поставьте Ends, но лучше первый вариант.
Возможно поможет
|
|
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 (статус: Посетитель), 17 апреля 2012, 00:53 [#3]:
Так помогло или нет?
P.S. Если объявляешь сегменты с использованием слова segment, то в конце КАЖДОГО сегиента нужно ставить слово Ends.
|
|
IlluminatI (статус: 2-ой класс), 17 апреля 2012, 00:56 [#4]:
Ну, по-крайней мере, стала коспилироваться Теперь вопрос в другом - в чем ошибка, и откуда столько мусора..?)
|
|
SOA (статус: Посетитель), 17 апреля 2012, 00:59 [#5]:
А что про ошибку пишет, и что за мусор?
|
|
IlluminatI (статус: 2-ой класс), 17 апреля 2012, 01:02 [#6]:
Ошибок никаких при компиляции и выполнении нет.
При запуске программы, она выдает кучу мусора из символов, перевод строки и, по середине, нужную надпись с пропуском: "In ut: A: ". При вводе чего-либо, выдает такую же точно фигню и завершается без ошибок.
|
|
SOA (статус: Посетитель), 17 апреля 2012, 01:07 [#7]:
Пнятно :/
|
|
IlluminatI (статус: 2-ой класс), 17 апреля 2012, 01:08 [#8]:
Соображений нет?
А то я уже все перебрал :/
|
|
SOA (статус: Посетитель), 17 апреля 2012, 10:41 [#9]:
IlluminatI: Если это не критично в данной ситуации, то попробуйте:
1. В директиве .model использовать модель памяти flat
2. В объявлениях прцедур не пишите near
3. при обращении к ячейкам памяти с помощью таких команд как lea
используйте 32 битные регистры.
Как то так.
|
|
IlluminatI (статус: 2-ой класс), 18 апреля 2012, 22:52 [#10]:
Начал сначала. Буду разбираться, спасибо...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|