UMBC | Decision-Making in Assembly Language | Previous | Next |
The comparison is the same for signed and unsigned numbers, but the conditional jumps are different.
The following will teach you how to do a GOTO. I must emphasis that you use a "Jump" only to implement Repetition and Selection, even though you have the power to do things differently!
Since we want the assembler to compute things for us, we will give the target as a label. (You can do it manually, however, if you go back and change the program later, it might change the distance of the jump and if you forget to make the change, you just broke your program! Therefore, always let the assembler worry about it.) Because of the distance limitation, we will call this a shortlabel. Actually, it could be an address, which is simply a number.
Note: Valid characters in labels are letters, numbers, _, $, #, @, ~, ., and ?. The only characters which may be used as the first character of an identifier are letters
Jumps do not alter the flags.
There is an unconditional jump, or one that is always preformed. The unconditional jump is not not limited to a short jump, and properly coded, can jump anywhere in memory!
The format is:
jmp label ; unconditional jump jconditional shortlabel ; conditional jump
Instruction | Description |
---|---|
JZ shortlabel | jump if zero |
JNZ shortlabel | jump if not zero |
JS shortlabel | jump if sign |
JNS shortlabel | jump if not sign |
JC shortlabel | jump if carry |
JNC shortlabel | jump if not carry |
JO shortlabel | jump if overflow |
JNO shortlabel | jump if not overflow |
JP shortlabel | jump if parity |
JNP shortlabel | jump if not parity |
JPE shortlabel | jump if parity even |
JPO shortlabel | jump if parity odd |
Instruction | Symbolic | Description |
---|---|---|
JE shortlabel | op1 = op2 | jump if equal |
JNE shortlabel | op1 != op2 | jump if not equal |
JG shortlabel | op1 > op2 | jump if greater than |
JNG shortlabel | !(op1 > op2) | jump if not greater than |
JGE shortlabel | op1 >= op2 | jump if greater than or equal |
JNGE shortlabel | !(op1 >= op2) | jump if not greater than or equal |
JL shortlabel | op1 < op2 | jump if less than |
JNL shortlabel | !(op1 < op2) | jump if not less than |
JLE shortlabel | op1 <= op2 | jump if less than or equal |
JNLE shortlabel | !(op1 <= op2) | jump if not less than or equal |
Suppose we want to do something in C like:
if (ax < bx) { X = -1; } else { X = 1; }
cmp ax, bx jl axLess ; go to 'axLess' if ax < bx mov word [X], 1 ; This is the 'else part jmp Both ; skip the 'then' part axLess: mov word [X], -1 ; This is the 'then' part Both:What if the conditional jump needs a long jump? Change the code to this:
cmp ax, bx jge notLess ; use a jump with the opposite condition jmp axLess ; now do a long jump notLess: mov word [X], 1 ; This is the 'else part jmp Both ; skip the 'then' part axLess: mov word [X], -1 ; This is the 'then' part Both: ; Everyone back together here
#includeint main ( void ) { short X; short in1, in2; printf( "Please enter two signed 16-bit integers\n" ); printf( "Enter an integer: " ); scanf( "%d", &in1 ); printf( "Enter an integer: " ); scanf( "%d", &in2 ); if ( in1 < in2 ) { X = -1; } else { X = 1; } printf( "X = %d\n", X ); return 0; }
section .data instruct db 'Please enter two signed 16-bit integers', 10, 0 instr1 db 'Enter an integer: ',0 mystring db 10, 'X = %d', 10, 0 instring db '%d',0 section .bss X resw 1 in1 resd 1 in2 resd 1 section .text global main ;must be declared for linker (ld) main: ;tell linker entry point extern printf extern scanf ;; put your code here getinput: push instruct call printf add esp, 4 push instr1 call printf add esp, 4 push in1 push instring call scanf add esp, 8 getinput2: push instr1 call printf add esp,4 push in2 push instring call scanf add esp, 8 mov eax, [in1] mov ebx, [in2] chkinput: cmp ax, bx jge notLess ; use a jump with the opposite condition jmp axLess ; now do a long jump notLess: mov word [X], 1 ; This is the 'else part jmp Both ; skip the 'then' part axLess: mov word [X], -1 ; This is the 'then' part Both: ; Everyone back together here mov ax, [X] cwde ; Since we are printing using %d, we need to convert X ; to 32 bits. push eax push mystring call printf add esp, 8 ;; The final part of the program must be a call to the operating system to exit ;;; the program. mov ebx,0 ;successful termination of program mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel ;; Notice the file just ends.