код C++ ниже Я пытаюсь реализовать в 32-битной сборки записывается так:Бесконечный цикл с использованием тройной вложенной для цикла (32-разрядную сборку)
for(int ebx = 3; ebx < 10; ebx++){
print("LO");
for(int esi = 2; esi < ebx; esi++){
PRINT("L1");
for(int ebp = 0; ebp < esi; ebp++){
PRINT("L2");
}
}
}
Это мой код сборки:
SECTION .data ; Section containing initialized data
helloWorld0: dw "L1",10,0
helloWorld1: dw "L2",10,0
helloWorld2: dw "L3",10,0
SECTION .bss ; Section containing uninitialized data
SECTION .text ; Section containing code
extern printf ; Print function from glibc
global main ; Linker needs this to find the entry point
main:
nop ; This no-op keeps gdb happy
push ebp ; Set up stack frame for debugger
mov ebp,esp
push ebx ; Must preserve EBP, EBX, ESI & EDI
push esi
push edi
; Everything before this is boilerplate; use it for all apps
mov ebx, 3 ;L1
mov esi, 2 ;L2
mov ebp, 0 ;L3
L1:
push helloWorld0
call printf
L2:
push helloWorld1
call printf
L3:
push helloWorld2
call printf
inc ebp
cmp ebp, esi
jne L3
inc esi
cmp esi, ebx
jne L2
mov esi, 2
inc ebx
cmp ebx, 10
jne L1
; Everything after this is boilerplate; use it for all apps
pop edi ; Restore saved registers
pop esi
pop ebx
mov esp,ebp ; Destroy stack frame before returning
pop ebp
ret ; Return control to Linux
Похоже, что код никогда не определяет, когда ebp = esi. Я новичок в ассемблере, поэтому мой профессор предоставил шаблоны. Я использовал EBP, ESI и EBX, поскольку они сохранены для использования. Любые идеи о том, что вызывает бесконечный цикл в третьем вложенном цикле?
Что вы узнали при отладке строки за строкой внутри цикла? –
Я использую терминал linux для кодирования, какое программное обеспечение необходимо отлаживать? –
Кажется, у вас есть аналогичное назначение для этого: http://stackoverflow.com/questions/39680843/infinite-loop-on-simple-assembly-loop. Некоторые из моих комментариев там будут применяться здесь. –