내가 32 비트 어셈블리에서 구현하기 위해 노력하고 아래의 C++ 코드는 너무로 기록됩니다무한 루프는
: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는 사용하기 위해 보존되어 있으므로 사용했습니다. 세 번째 중첩 루프에서 무한 루프를 일으키는 것에 대한 아이디어가 있습니까?
루프 내부에서 라인 단위로 디버깅 할 때 무엇을 발견 했습니까? –
리눅스 터미널을 사용하여 코드를 디버깅하려면 어떤 소프트웨어가 필요합니까? –
당신과 비슷한 임무가 있다고 생각됩니다 : http://stackoverflow.com/questions/39680843/infinite-loop-on-simple-assembly-loop. 거기에 내 의견 중 일부는 여기에 적용됩니다. –