Sök…


Introduktion

Varje bit av icke-trivial programvara behöver flödeskontrollstrukturer för att avleda programflödet enligt förhållanden. Montering som är programmeringsspråket på lägsta nivå ger endast primitiv för kontrollstrukturer. Typiskt påverkar maskindrift flaggor i CPU, och villkorade grenar / hopp implementerar flödeskontrollen. Vid montering måste alla högre nivåkontrollstrukturer konstrueras av sådana primitiv.

Trivial IF-THEN-ELSE i m68k församling

; IF d0 == 10 GO TO ten, ELSE GO TO other
    CMP    #10,d0        ; compare register contents to immediate value 10
                         ; instruction affects the zero flag
    BEQ    ten           ; branch if zero flag set
other:
    ; do whatever needs to be done for d0 != 10
    BRA    afterother    ; unconditionally jump across IF case 
ten:
    ; do whatever needs to be done for d0 == 10
afterother:
    ; continue normal common program flow

Vilka anvisningar som påverkar vilka flaggor och vilka villkorade grenar (som också kan baseras på specifika kombinationer av flaggor ) finns tillgängliga beror mycket på din valda CPU och bör letas upp i manualerna.

FÖR ... NÄSTA i Z80-montering

Z80 har en specifik instruktion för att implementera DJNZ : DJNZ står för "decrement B register and jump if not zero". Så, B är det valda registret att implementera slingor på denna processor. FÖR ... NÄSTA måste implementeras "bakåt", eftersom registret räknas ner till noll. Andra CPU: er (som 8086, denna CPU använder CX-registret som slingräknare) kan ha liknande specifika slingräknaregister och instruktioner, vissa andra CPU: er tillåter slingkommandon med godtyckliga register (m68k har en DBRA-instruktion som fungerar med vilket dataregister som helst).

; Trivial multiplication (by repeated adding, ignores zero in factors, so 
; not recommended for general use)
;
; inputs:    A = Factor 1
;            B = Factor 2
;
; output:    A = Factor 1 * Factor 2
;
; Pseudo code
; C = A : A = 0 : FOR B = Factor 2 DOWNTO 0 : A = A + C : NEXT B

mul:
     LD    C,A        ; Save Factor 1 in C register
     XOR   A          ; Clear accumulator
mLoop:
     ADD   A,C        ; Add Factor 1 to accumulator
     DJNZ  mLoop      ; Do this Factor 2 times
     RET              ; return to caller

If-uttalande i Intel-syntaxmontering

section .data
    msg_eq db 'Equal', 10
    len_eq equ $ - msg_eq

    msg_le db 'Less than', 10
    len_le equ $ - msg_le

    msg_gr db 'Greater than', 10
    len_gr equ $ - msg_gr ; Length of msg_gr
section .text
    global _main ; Make the _main label global for linker
_main:
    cmp 4, 5 ; Compare 4 and 5
    je _equal ; je = jump if equal
    jl _less ; jl = jump if less
    jg _greater ; jg = jump if greater
exit:
    ret ; Return
_equal:
    ; Whatever code here
    mov rax, 0x2000004 ; sys_write, 4 for linux
    mov rdi, 1 ; STDOUT
    mov rsi, msg_eq
    mov rdi, len_eq
    
    syscall
    
    jmp exit ; Exit
_less:
    ; Whatever code here
    mov rax, 0x2000004
    mov rdi, 1
    mov rsi, msg_le
    mov rdi, len_le
    
    syscall
    
    jmp exit
_greater:
    ; Whatever code here
    
    mov rax, 0x2000004
    mov rdi, 1
    mov rsi, msg_gr
    mov rdi, len_gr
    
    syscall
    jmp exit

Slinga medan villkoret är sant i Intel syntaxmontering

section .data
    msg db 'Hello, world!', 0xA
    len equ $ - msg
section .text
global _main
_main:
    mov rax, 0 ; This will be the current number
    mov rcx, 10 ; This will be the last number
    
_loop:
    cmp rax, rcx
    jl .loopbody ; Jump to .loopbody if rax < rcx
    jge _exit ; Jump to _exit if rax ≥ rcx
.loopbody:
    push rax ; Store the rax value for later use

    mov rax, 0x2000004 ; 4 for Linux
    mov rdi, 1 ; STDOUT
    mov rsi, msg
    mov rdx, len

    syscall

    pop rax ; Take it back to rax

    inc rax ; Add 1 to rax. This is required since the loop must have an ending.    

    jmp _loop ; Back to loop
_exit:
    ret    ; Return

Detta kommer att köra .loopbody så länge som rax < rcx .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow