My ma’am give me an assignment in which i have to make a program which will take input through keyboard and check the conventional order of the nested brackets.
for example:
input= {[()]}, output = correct format, input = ({[]}) output = incorrect
My program:
.model small
.stack 100h
.386
.data
msg1 db "this is a correct format of nested brackets$"
msg2 db "this is no a correct format of nested brakets$"
.code
main proc
mov ax,@data
mov ds,ax
mov cx,15
push '#'
l1:
mov ah,1
int 21h
cmp al,'['
je pushh1
cmp al,'{'
je pushh2
cmp al,'('
je pushh3
cmp al,']'
je pop1
cmp al,'}'
je pop2
cmp al,')'
je pop3
jmp ser
pushh1:
pop dx
cmp dx,'('
push dx
je wrongorder
movzx dx,al
push dx
jmp ser
pushh2:
pop dx
cmp dx,'['
je wrongorder
cmp dx,'('
je wrongorder
push dx
movzx dx,al
push dx
jmp ser
pushh3:
pop dx
cmp dx,'{'
push dx
je wrongorder
movzx dx,al
push dx
jmp ser
wrongorder:
mov dx,'*'
push dx
jmp ser
pop1:
pop dx
cmp dx,'#'
push dx
je ser
pop dx
cmp dx,'{'
push dx
je ser
pop dx
cmp dx,'('
push dx
je ser
pop dx
jmp ser
pop2:
pop dx
cmp dx,'#'
push dx
je ser
pop dx
cmp dx,'('
push dx
je ser
pop dx
cmp dx,'['
push dx
je ser
pop dx
jmp ser
pop3:
pop dx
cmp dx,'#'
push dx
je ser
pop dx
cmp dx,'{'
push dx
je ser
pop dx
cmp dx,'['
push dx
je ser
pop dx
ser:
cmp al,'q'
je labo
loop l1
labo:
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h
mov ah,2h
pop dx
;int 21h
cmp dx,'#'
je labe
cmp dx,'#'
jnz labr
labe:
mov dx, offset msg1
mov ah,9h
int 21h
jmp lab8
labr:
mov dx, offset msg2
mov ah,9h
int 21h
lab8:
mov ah,4ch
int 21h
main endp
end main
but when i compile this code the masm shows me an error:
jmp destination too far by 30 bytes.
Please tell me what should i do to get rid of this message and run my program.
0 / 0 / 0 Регистрация: 30.10.2013 Сообщений: 142 |
||
1 |
||
Ошибка при переходе на метку25.10.2015, 17:19. Показов 3390. Ответов 8
Здравствуйте! Вложения
__________________
0 |
alexcoder 1778 / 756 / 153 Регистрация: 03.06.2009 Сообщений: 5,837 |
||||||||
26.10.2015, 09:52 |
2 |
|||||||
У меня и при a=0 не компилируется. Замените loop j1 на
Еще как вариант, можно внутри цикла некоторые команды либо заменить/сократить, либо выбросить, но меня терзают смутные сомнения по поводу правильности программы, оптимизация будет иметь смысл только если программа правильно работает.
Вот это вообще глаз режет.
0 |
Dick777 0 / 0 / 0 Регистрация: 30.10.2013 Сообщений: 142 |
||||
26.10.2015, 12:01 [ТС] |
3 |
|||
alexcoder, программа вроде написана верно, я как раз отлаживала ее и проверяла на ошибки, как вылезла эта ошибка. Мое задание в приложении. Там, в ходе вычисления в регистре EAX появляется 0 и я ошибочно копировала в а значение EAX
Но отлаживая, исправила на ЕВХ, т.е. в а копируется -6. И тут вылезла эта ошибка. А LOOP не случайно там, в ЕСХ хранится значение, до которого должен увеличиваться мой счетчик по j. Поэтому заменить его не могу. Миниатюры
0 |
1778 / 756 / 153 Регистрация: 03.06.2009 Сообщений: 5,837 |
|
26.10.2015, 12:06 |
4 |
Не знаю что там у Вас хранится в ecx, loop эквивалентен этим двум командам. Иначе говоря, выполняет то же самое, то есть уменьшает ecx.
1 |
Constantin Cat 3405 / 1824 / 489 Регистрация: 28.02.2015 Сообщений: 3,699 |
||||
26.10.2015, 16:06 |
5 |
|||
А LOOP не случайно там, в ЕСХ хранится значение, до которого должен увеличиваться мой счетчик по j. Команда LOOP, когда выполняется, уменьшает значение счетчика ЕСХ на 1 и заканчивает цикл если ЕСХ = 0.
1 |
0 / 0 / 0 Регистрация: 30.10.2013 Сообщений: 142 |
|
26.10.2015, 21:02 [ТС] |
6 |
Команда LOOP, когда выполняется, уменьшает значение счетчика ЕСХ на 1 и заканчивает цикл если ЕСХ = 0. Да, вы правы. Так и делала, а на словах, наверно вспомнились циклы из Си.
Я бы переписал по другому этот участок кода: Спасибо, ваш код логичней будет. Нам просто не дали команду JNS, только стандартные операции сравнения. Теперь буду знать.
0 |
3405 / 1824 / 489 Регистрация: 28.02.2015 Сообщений: 3,699 |
|
26.10.2015, 22:46 |
7 |
Нам просто не дали команду JNS Ха. CF — . . . которые изменяют свое состояние взависимости от результата выполнения различных команд, значит под него есть и команда перехода, для его анализа.
0 |
Dick777 0 / 0 / 0 Регистрация: 30.10.2013 Сообщений: 142 |
||||||
26.10.2015, 23:46 [ТС] |
8 |
|||||
Constantin Cat, благодаря
Я бы переписал по другому этот участок кода: код компилируется (т.е. не выскакивает ошибка). Но функциональные ошибки выскакивают..
Вложения
0 |
3405 / 1824 / 489 Регистрация: 28.02.2015 Сообщений: 3,699 |
|
27.10.2015, 00:36 |
9 |
1)Ошибка какая.
0 |
Hi Guys, i´m trying to asemble a routine that contains a jmp table, but it is exceeding 8 bytes, and this error came up:
FbRtl.asm(8115) : error A2075: jump destination too far : by 8 byte(s)
I tried to use the LMP command, or even used two «::» on th destination labels, but it keeps showing the error. How can i assemble this ?
.data
_achTabSpaces_7866 db ' ',0
db 0
db 0
db 0
ConPrintTTY_Tbl dd loc_40F378
dd loc_40F360
dd loc_40F2D0
dd loc_40F280
dd loc_40F3D0
dd loc_40F3D0
dd loc_40F220
.code
; =============== S U B R O U T I N E =======================================
public fb_ConPrintTTY
fb_ConPrintTTY proc near ; CODE XREF: fb_ConsolePrintBufferEx+1BC↑p
; fb_GfxPrintBufferEx+112↓p
var_45C = dword ptr -45Ch
var_458 = dword ptr -458h
var_454 = dword ptr -454h
var_450 = dword ptr -450h
var_44C = dword ptr -44Ch
var_448 = dword ptr -448h
var_438 = dword ptr -438h
var_434 = dword ptr -434h
var_430 = dword ptr -430h
var_42C = dword ptr -42Ch
var_428 = dword ptr -428h
var_424 = dword ptr -424h
var_420 = dword ptr -420h
var_41C = byte ptr -41Ch
arg_0 = dword ptr 4
arg_4 = dword ptr 8
arg_8 = dword ptr 0Ch
arg_C = dword ptr 10h
push ebp
push edi
push esi
push ebx
sub esp, 44Ch
mov ebp, [esp+45Ch+arg_0]
mov edi, [esp+45Ch+arg_4]
mov ecx, [esp+45Ch+arg_8]
mov eax, [ebp+14h]
sub eax, [ebp+0Ch]
add eax, 1
mov [esp+45Ch+var_420], eax
jz loc_40F26F
mov edx, [ebp+1Ch]
test ecx, ecx
jz loc_40F26F
lea eax, [edi+ecx]
mov [esp+45Ch+var_428], 0
mov [esp+45Ch+var_430], eax
mov [esp+45Ch+var_42C], 0
mov [esp+45Ch+var_438], 0
mov [esp+45Ch+var_434], edx
loc_40F200: ; CODE XREF: fb_ConPrintTTY+B5↓j
movzx eax, byte ptr [edi]
sub eax, 7
cmp al, 6 ; switch 7 cases
ja loc_40F3D0 ; jumptable 0040F211 default case
movzx eax, al
jmp ds:ConPrintTTY_Tbl[eax*4] ; switch jump
; ---------------------------------------------------------------------------
loc_40F220:: ; CODE XREF: fb_ConPrintTTY+71↑j
; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
mov ebx, [ebp+0Ch] ; jumptable 0040F211 case 6
xor esi, esi
sub ebx, [esp+45Ch+var_434]
loc_40F229: ; CODE XREF: fb_ConPrintTTY+1D0↓j
; fb_ConPrintTTY+267↓j
mov edx, [esp+45Ch+var_438]
test edx, edx
jnz short loc_40F2A8
loc_40F231: ; CODE XREF: fb_ConPrintTTY+101↓j
; fb_ConPrintTTY+128↓j
add [ebp+1Ch], ebx
mov eax, [ebp+1Ch]
add [ebp+20h], esi
mov [esp+45Ch+var_434], eax
mov [esp+45Ch+var_428], 1
mov [esp+45Ch+var_438], 0
loc_40F24E: ; CODE XREF: fb_ConPrintTTY+157↓j
; fb_ConPrintTTY+1BA↓j ...
add edi, 1
cmp [esp+45Ch+var_430], edi
jnz short loc_40F200
mov ebx, [esp+45Ch+var_438]
test ebx, ebx
jnz loc_40F428
mov ecx, [esp+45Ch+var_428]
test ecx, ecx
jnz loc_40F450
loc_40F26F: ; CODE XREF: fb_ConPrintTTY+2C↑j
; fb_ConPrintTTY+37↑j ...
add esp, 44Ch
pop ebx
pop esi
pop edi
pop ebp
retn
; ---------------------------------------------------------------------------
loc_40F280:: ; CODE XREF: fb_ConPrintTTY+71↑j
; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
mov esi, [esp+45Ch+arg_C] ; jumptable 0040F211 case 3
test esi, esi
jz loc_40F400
mov edx, [esp+45Ch+var_438]
mov ebx, [ebp+0Ch]
mov esi, 1
sub ebx, [esp+45Ch+var_434]
test edx, edx
jz short loc_40F231
lea esi, [esi+0]
nop
loc_40F2A8: ; CODE XREF: fb_ConPrintTTY+8F↑j
mov eax, [esp+45Ch+var_42C]
mov [esp+45Ch+var_45C], ebp
mov [esp+45Ch+var_454], eax
lea eax, [esp+45Ch+var_41C]
mov [esp+45Ch+var_458], eax
call fb_ConPrintRaw
mov [esp+45Ch+var_42C], 0
jmp loc_40F231
; ---------------------------------------------------------------------------
loc_40F2D0:: ; CODE XREF: fb_ConPrintTTY+71↑j
; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
mov eax, [esp+45Ch+var_434] ; jumptable 0040F211 case 2
sub eax, [ebp+0Ch]
lea ebx, [eax+8]
and ebx, 0FFFFFFF8h
sub ebx, eax
mov eax, [esp+45Ch+var_438]
add eax, ebx
cmp eax, 400h
ja loc_40F3E8
loc_40F2F0: ; CODE XREF: fb_ConPrintTTY+24E↓j
mov ecx, offset _achTabSpaces_7866 ; " "
loc_40F2F5: ; CODE XREF: fb_ConPrintTTY+227↓j
test ebx, ebx
jz loc_40F24E
mov eax, [esp+45Ch+var_438]
lea esi, [ebx-1]
mov [esp+45Ch+var_424], eax
loc_40F308: ; CODE XREF: fb_ConPrintTTY+27D↓j
add [esp+45Ch+var_434], ebx
mov eax, [esp+45Ch+var_434]
cmp eax, [ebp+14h]
jle short loc_40F324
sub eax, [ebp+0Ch]
cdq
idiv [esp+45Ch+var_420]
add edx, [ebp+0Ch]
mov [esp+45Ch+var_434], edx
loc_40F324: ; CODE XREF: fb_ConPrintTTY+173↑j
add esi, [esp+45Ch+var_438]
lea eax, [esi+1]
mov [esp+45Ch+var_438], eax
mov eax, [esp+45Ch+var_424]
mov [esp+45Ch+var_424], ebx
sub ecx, eax
lea esi, [esi+0]
loc_40F340: ; CODE XREF: fb_ConPrintTTY+1B0↓j
mov edx, eax
add eax, 1
movzx ebx, byte ptr [ecx+eax-1]
mov byte ptr [esp+eax+45Ch+var_420+3], bl
cmp esi, edx
jnz short loc_40F340
mov ebx, [esp+45Ch+var_424]
add [esp+45Ch+var_42C], ebx
jmp loc_40F24E
; ---------------------------------------------------------------------------
loc_40F360:: ; CODE XREF: fb_ConPrintTTY+71↑j
; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
xor ebx, ebx ; jumptable 0040F211 case 1
mov eax, [esp+45Ch+var_434]
cmp [ebp+0Ch], eax
setl bl
xor esi, esi
neg ebx
jmp loc_40F229
; ---------------------------------------------------------------------------
loc_40F378:: ; CODE XREF: fb_ConPrintTTY+71↑j
; DATA XREF: .rdata:ConPrintTTY_Tbl↓o
call fb_Beep ; jumptable 0040F211 case 0
cmp [esp+45Ch+var_438], 400h
jbe loc_40F24E
xor ebx, ebx
loc_40F38D: ; CODE XREF: fb_ConPrintTTY+243↓j
mov ecx, edi
loc_40F38F: ; CODE XREF: fb_ConPrintTTY+259↓j
mov eax, [esp+45Ch+var_42C]
mov [esp+45Ch+var_45C], ebp
mov [esp+45Ch+var_424], ecx
mov [esp+45Ch+var_454], eax
lea eax, [esp+45Ch+var_41C]
mov [esp+45Ch+var_458], eax
call fb_ConPrintRaw
mov [esp+45Ch+var_42C], 0
mov ecx, [esp+45Ch+var_424]
mov [esp+45Ch+var_438], 0
mov [esp+45Ch+var_428], 0
jmp loc_40F2F5
; ---------------------------------------------------------------------------
loc_40F3D0:: ; CODE XREF: fb_ConPrintTTY+68↑j
; fb_ConPrintTTY+71↑j
; DATA XREF: ...
mov esi, [esp+45Ch+var_438] ; jumptable 0040F211 default case
lea eax, [esi+1]
cmp eax, 400h
jbe short loc_40F410
mov ebx, 1
jmp short loc_40F38D
; ---------------------------------------------------------------------------
loc_40F3E8: ; CODE XREF: fb_ConPrintTTY+14A↑j
mov eax, [esp+45Ch+var_438]
test eax, eax
jz loc_40F2F0
mov ecx, offset _achTabSpaces_7866 ; " "
jmp short loc_40F38F
; ---------------------------------------------------------------------------
loc_40F400: ; CODE XREF: fb_ConPrintTTY+E9↑j
xor ebx, ebx
mov esi, 1
jmp loc_40F229
; ---------------------------------------------------------------------------
loc_40F410: ; CODE XREF: fb_ConPrintTTY+23C↑j
mov [esp+45Ch+var_424], esi
mov ecx, edi
xor esi, esi
mov ebx, 1
jmp loc_40F308
; ---------------------------------------------------------------------------
loc_40F428: ; CODE XREF: fb_ConPrintTTY+BD↑j
mov eax, [esp+45Ch+var_42C]
mov [esp+45Ch+var_45C], ebp
mov [esp+45Ch+var_454], eax
lea eax, [esp+45Ch+var_41C]
mov [esp+45Ch+var_458], eax
call fb_ConPrintRaw
add esp, 44Ch
pop ebx
pop esi
pop edi
pop ebp
retn
; ---------------------------------------------------------------------------
loc_40F450: ; CODE XREF: fb_ConPrintTTY+C9↑j
mov eax, [ebp+18h]
cmp eax, 0FFFFFFFFh
jz loc_40F26F
mov edx, [ebp+20h]
cmp eax, edx
jge loc_40F26F
sub edx, eax
mov [esp+45Ch+var_44C], eax
mov [esp+45Ch+var_448], edx
mov eax, [ebp+14h]
mov [esp+45Ch+var_450], eax
mov eax, [ebp+10h]
mov [esp+45Ch+var_454], eax
mov eax, [ebp+0Ch]
mov [esp+45Ch+var_45C], ebp
mov [esp+45Ch+var_458], eax
call dword ptr [ebp+4]
jmp loc_40F26F
fb_ConPrintTTY endp
The error is at
jmp ds:ConPrintTTY_Tbl[eax*4] ; switch jump
I tried some of these tips:
https://www.cyberforum.ru/assembler/thread1005284-page35.html
https://stackoverflow.com/questions/32706833/how-to-code-a-far-absolute-jmp-call-instruction-in-masm
But, didn´t suuceed to fix. How can this be fixed ?
Note: The beginning of he file whwre this function is called is:
; #########################################################################
;
; Build this DLL from the batch file called BldDLL.bat
;
; #########################################################################
.686
.model flat, stdcall
.xmm
option casemap :none ; case sensitive
-
Компилер ругается на следующим текстом
-
error A2075: jump destination too far : by 1922 byte(s)
Вляпать фар пробовал(синтаксис использования не нашел), но результата ноль, не помню как сделать дальний прыжок, возможен ли он вообще?
-
-
l_inc
New Member
- Публикаций:
-
0
- Регистрация:
- 29 сен 2005
- Сообщения:
- 2.566
JCronuz
Он бывает только короткий. -
Моя пьяная голова сейчас не поймет о чем Вы, я так понял нельзя пролетить через длинный кусок кода, вот так?
-
l_inc
New Member
- Публикаций:
-
0
- Регистрация:
- 29 сен 2005
- Сообщения:
- 2.566
JCronuz
Говорю, что только короткие прыжки jecxz бывают. Длина кода операции — два байта. Смещение в коде — один байт. Максимальная дальность — +127/-128.
Адаптированный перевод для пьяной головы: через «много текста» низзя. -
JCronuz
-
;влезет текста сколько хочешь
-
-
JCronuz
а вообще кодинг в хлам пьяном виде это дзенно— так писать в бегинерс намного интереснее
-
Z3N
New Member
- Публикаций:
-
0
- Регистрация:
- 10 фев 2009
- Сообщения:
- 812
Возможно это немного поздновато, но, наверно лучше будет
test ecx,ecx
jz KudanadoКаллы тармозные…
-
JCronuz
приятно похмелиться … -
Mikl___
Супермодератор
Команда форума- Публикаций:
-
14
- Регистрация:
- 25 июн 2008
- Сообщения:
- 3.468
JCronuz
jecxz и loop — близнецы-братья —> отличие в кодировке всего один бит и оба могут делать только short jmp -
Mikl___
Супермодератор
Команда форума- Публикаций:
-
14
- Регистрация:
- 25 июн 2008
- Сообщения:
- 3.468
Instuction |Opcode
LOOPNE rel8 |E0 cb
LOOPE rel8 |E1 cb
LOOP rel8 |E2 cb
JCXZ/JECXZ/JRCXZ rel8 |E3 cb -
wasm_test
wasm test user
- Публикаций:
-
0
- Регистрация:
- 24 ноя 2006
- Сообщения:
- 5.582
Rockphorr
ох, тебя за флейм не по теме бы еще + на недельку.
My ma’am give me an assignment in which i have to make a program which will take input through keyboard and check the conventional order of the nested brackets.
for example:
input= {[()]}, output = correct format, input = ({[]}) output = incorrect
My program:
.model small
.stack 100h
.386
.data
msg1 db "this is a correct format of nested brackets$"
msg2 db "this is no a correct format of nested brakets$"
.code
main proc
mov ax,@data
mov ds,ax
mov cx,15
push '#'
l1:
mov ah,1
int 21h
cmp al,'['
je pushh1
cmp al,'{'
je pushh2
cmp al,'('
je pushh3
cmp al,']'
je pop1
cmp al,'}'
je pop2
cmp al,')'
je pop3
jmp ser
pushh1:
pop dx
cmp dx,'('
push dx
je wrongorder
movzx dx,al
push dx
jmp ser
pushh2:
pop dx
cmp dx,'['
je wrongorder
cmp dx,'('
je wrongorder
push dx
movzx dx,al
push dx
jmp ser
pushh3:
pop dx
cmp dx,'{'
push dx
je wrongorder
movzx dx,al
push dx
jmp ser
wrongorder:
mov dx,'*'
push dx
jmp ser
pop1:
pop dx
cmp dx,'#'
push dx
je ser
pop dx
cmp dx,'{'
push dx
je ser
pop dx
cmp dx,'('
push dx
je ser
pop dx
jmp ser
pop2:
pop dx
cmp dx,'#'
push dx
je ser
pop dx
cmp dx,'('
push dx
je ser
pop dx
cmp dx,'['
push dx
je ser
pop dx
jmp ser
pop3:
pop dx
cmp dx,'#'
push dx
je ser
pop dx
cmp dx,'{'
push dx
je ser
pop dx
cmp dx,'['
push dx
je ser
pop dx
ser:
cmp al,'q'
je labo
loop l1
labo:
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h
mov ah,2h
pop dx
;int 21h
cmp dx,'#'
je labe
cmp dx,'#'
jnz labr
labe:
mov dx, offset msg1
mov ah,9h
int 21h
jmp lab8
labr:
mov dx, offset msg2
mov ah,9h
int 21h
lab8:
mov ah,4ch
int 21h
main endp
end main
but when i compile this code the masm shows me an error:
jmp destination too far by 30 bytes.
Please tell me what should i do to get rid of this message and run my program.
From BetaArchive Wiki
Jump to:navigation, search
Article ID: 79829
Article Last Modified on 10/17/2003
- Microsoft Macro Assembler 6.0 Standard Edition
This article was previously published under Q79829
SYMPTOMS
In the Microsoft Macro Assembler (MASM) version 6.0, the following error message may be produced
A2075: jump destination too far : by xxxxx byte(s)
when using the /Zm option, the MASM driver with MASM 6.0, or OPTION M510. When MASM 5.1 compatibility is not used or MASM 5.1 is used, the code assembles correctly.
CAUSE
This behavior is caused by using the current address operator, $, minus a constant (for example, jmp $-5), and the MASM driver with MASM 6.0, OPTION M510, or the /Zm switch when assembling.
RESOLUTION
Use a label instead of the current address operator or assemble without the MASM 5.1 switch.
STATUS
Microsoft has confirmed this to be a problem in MASM version 6.0. This problem was corrected in MASM version 6.0a.
MORE INFORMATION
The /Zm switch is the MASM 5.1 compatibility switch in MASM 6.0. The MASM driver calls ML with the /Zm option in MASM 6.0. OPTION M510 is a directive that specifies MASM 5.1 compatibility.
Sample Code
; Assembly options need: /Zm DOSSEG .MODEL small .STACK 4096 .DATA .CODE start: mov al,5h here: dec al jnz $-2 ; This line causes the A2075 error. ;jnz here ; Uncomment this line and comment out mov ax,4c00h ; jnz $-2 to get the code to assemble int 21h ; correctly. END start
Additional query words: 6.00 5.10 buglist6.00 fixlist6.00a
Keywords: kbfix KB79829