Сборка х86 | возврат (в отставке) не работает - PullRequest
2 голосов
/ 15 апреля 2020

Ну, недавно я начал изучать Assembly 8086 в основном из любопытства.

Ввод на ассемблере позволяет вам печатать только один символ, поэтому я попытался создать программу на ассемблере 8086, которая позволяет вводить целочисленный ввод multi-di git, заканчивая ввод пробелом (' '), затем добавляя число и печатая значение.

Я видел, что push и pop можно использовать для передачи аргументов в процедуру, но я пытался использовать их, чтобы моя процедура возвращала что-то и сохраняла ее в переменной, я не мог представить способ сделать это с ret, основываясь на моих знаниях по Assembly 8086 так что ... во всяком случае, я сделал процедуру, но по какой-то причине ret в конце процедуры, кажется, не работает, и процедура выполняется бесконечное число раз.

Код так далеко:

.model small
org 100h

.data

    fv db 0 ;variables to store the numbers
    sv db 0 ;

.code
    jmp start ;a pattern of mine in some way to avoid a procedure be called twice and what everyone shows 
              ;just doesn't work, after the main ends, all the procs run again,
              ;it worked perfectly any other time I used procedures to my program

    f1 proc   ;the procedure

        mov cl, 0 ;clear cl bcs later the first time is used I have not stored some thing in there and 
                  ;always for some reason, to all my programs "cx" has a value stored, maybe from the
                  ;emulator I use

        mov ah, 1h ;single character input
        int 21h    ;

        while:
            cmp al, ' ' ;if input is equal to "space"("space" must be the last input, as far as I have
                        ;gone with the program)
            jne true    ; if input != ' '
            je false    ; if input == ' '
            true:       ; in case input != ' '
                mov bl, al ;store the input
                mov al, cl ;digits taken from input previously
                sub bl, 30h;bcs if input == 8, whatactually is stored is the ASCII code of it in this
                           ;case : 38h or 56

                mov dl, 10 ;What I thought : if user writes as input 12, what actually types 1 * 10 + 2
                           ;so I am storing 10 to dl to multiply the previously entered numbers in the
                           ;example above : 1

                mul dl     ;multiplication

                add al, bl ;add new input to (old inputs * 10)

                mov cl, al ;store old inputs

                mov ah, 1h ;input
                int 21h    ;
                jmp while  ;check again if input == ' ' or not
        false: ;in case input == ' '
            mov ch, 0 ; in chase ch had some thing else in it from something else than the
                      ; input(0 <= input <= 127~128(127 + 128 = 255))
            push cx   ; store cx(final result from the inputs) in to the stack to store it to a 
                      ; variable

            ret       ; end procedure
    f1 endp           ; 

    start:            ; with "jmp start" at the start of the ".code" makes the program start from "main"
    main proc

        call f1    ;call procedure
        pop bx     ;store result in to bx bcs `push` and `pop` as far as I know need at least 16-bit
                   ;and varables are 8-bit, I know I can make them 16-bit but anyway
        mov fv, bl ;store result to variable   

    endp
end main

1 Ответ

1 голос
/ 15 апреля 2020

Ну, я нашел это, прежде чем положить sh что-нибудь еще в стек (я искал, как push, pop, call и ret работают) Я pop -введен в bx, а затем после того, как я push -ед в стек, что я хотел push, до ret I push -ед, что было bx (адрес ret должен был прыгнуть) и тогда я ret.

код:

.model small
org 256

.data

    fv db 0
    sv db 0

.code
    jmp start

    f1 proc

        mov cl, 0
        mov ah, 1h
        int 21h

        while:
            cmp al, ' '
            jne true
            je false
            true:
                mov bl, al
                mov al, cl
                sub bl, 30h
                mov dl, 10
                mul dl
                add al, bl
                mov cl, al
                mov ah, 1h
                int 21h
                jmp while
        false:
            pop bx
            mov ch, 0
            push cx
            push bx    
            ret
    f1 endp

    start:
    main proc

        call f1
        pop bx
        mov fv, bl    

    endp
end main
...