2014-01-27 2 views
0

어셈블리에서 시작하여 eax 값을 인쇄하기위한 간단한 루프를 만들려고 시도하지만 작동하지 않으며 여기에서 내가하는 일을 완전히 확신하지 못합니다.어셈블리 루프에서 값을 인쇄하지 않습니다.

global _main  ; make visible for linker 
extern _printf  ; link with printf 
; ------------------------------- 
section .const 
    hello db `Hello world! %d \n\0`; 0 on stringi lõpp. 
    arv dw 5 ; %d võimaldab stringis arvu näidata. 
    otsitav dw 10 ;10 on reavahetus 
    vastus dw 0 ;dw läheb arvule 
section .text 
; ------------------------------- 
_main: 
    mov eax, otsitav ; Annan eax-le kasutaja sisestatud väärtuse. 
    mov ebx, 1 ; Annab ebx-le väärtuse 1 - sealt alustab for tsükliga. 

    .loop1: 
    dec eax ; võtab eax-ilt ühe ära. 
    push eax 
    call _printf 
    add esp, 4 ; tasakaalustab. 
    cmp eax, 0 ; eax ? 0 
    je .loop1 ; kui ? asemele saab = panna siis hüppa .loop1 juurde 
    ret 
+2

'printf'에는 사용자가 지정한 나머지 인수를 해석 할 수있는 형식 문자열이 필요합니다. 또한, 함수 호출에서 값을 유지하는'eax '에 의존하지 마십시오. – Michael

답변

0

난 내가 정말 무슨 일이 있었는지 몰랐다 그래서 귀하의 의견을 이해할 수 없었다,하지만 난 당신의 카운터를 저장하는 BSS 섹션을 사용하여 당신을 위해 예제 프로그램을 만들어;

global _main 
extern _printf 

[section] .bss 
    storage resd 1  ; reserve 1 dword 

[section] .data 
    fmt db "output = %s %d", 0dh,0ah,0 ; newline in formate now 

    hello db "hello world",0 ; the string 

    count equ 10    ; output ten times 

[section] .text 

_main: 
    push ebp 
    mov ebp, esp   ; stack related 

    mov eax, count 
    mov dword[storage], eax ; store eax's current value 

nLoop: 
    push eax   
    push hello 
    push fmt 
    call _printf 
    add esp, 12    ; clean 3 args (4 * 3) 

    mov eax, dword[storage] ; grab current count 
    sub eax, 1 
    mov dword[storage], eax ; store new value for later 
    jnz nLoop    ; test if value is zero 

    leave ; also stack related 
    ret 

출력;

output = hello world 10 
output = hello world 9 
output = hello world 8 
output = hello world 7 
output = hello world 6 
output = hello world 5 
output = hello world 4 
output = hello world 3 
output = hello world 2 
output = hello world 1 
+1

'cmp'의 쓸모없는 사용. 'dec eax'가 만든 플래그를 사용하여 그 명령어를 사용하지 않고'jnz'로 바로 바꿀 수 있습니다. 사실, 캐리 플래그를 저장할 필요가 없으므로, 왜 더 큰지 -'sub eax, 1 '일지라도'dec eax'를 사용하는 이유는 알 수 없습니다. –

+0

오, 젠장, 처음에는 'jnz'가 있었고,'sub'는 그 일을하기위한 나의 논리조차도 기억할 수 없다! 말해줘서 고맙다!! 그것을'sub' 명령을 사용하도록 바꾸십시오. 나는 아무런 이유없이 주석 처리했습니다 : / – James

관련 문제