Trying to print the greatest number (a & b) by using the below assembly code. But it is printing the "first" (Welcome) message only. I just want to print the "second" (i.e greatest) message as well.
[IsGreater.asm]
; Compares the two operand (A & B)
; Prints "YES" if "A > B"
; Prints "NO" if "A < B"
; Prints "EQUAL" if "A == B"
section .data;
Message: db "Welcome to comparision program.", 10;
MessageLength: equ $-Message;
AMessage: db "Output: A is greater than B.", 10;
AMessageLength: equ $-AMessage;
BMessage: db "Output: B is greater than A.", 10;
BMessageLength: equ $-BMessage;
section .bss;
; Dynamic variables
a: resb 4;
b: resb 5;
section .text;
global _start;
; -----------------
write:
mov eax, 4; sys_write
mov ebx, 1; file descriptor (output)
mov ecx, Message;
mov edx, MessageLength;
int 80h; sys_call (execute)
exit:
mov eax, 1; sys_exit
mov ebx, 0; set "no error"
int 80h; sys_call
printA:
mov eax, 4; sys_write
mov ebx, 1; file descriptor (output)
mov ecx, AMessage;
mov edx, AMessageLength;
int 80h; sys_call (execute)
printB:
mov eax, 4; sys_write
mov ebx, 1; file descriptor (output)
mov ecx, BMessage;
mov edx, BMessageLength;
int 80h; sys_call (execute)
_start:
jmp write;
; mov word [a], 4;
mov eax, [a];
; mov word [b], 5;
mov ebx, [b];
; Compare "a > b"
cmp eax, ebx;
jg printA; Jump IF Greater (OR) when "Zero Flag" ZF is "0".
jmp printB; Else print B
jmp exit;
Current Output:
$ ./IsGreater
Welcome to comparision program.
Expected Output:
$ ./IsGreater
Welcome to comparision program.
Output: B is greater than A.
Compile Command: $ nasm IsGreater.asm -o IsGreater.o -f elf -F STABS -g
Linking Command: $ ld IsGreater.o -o IsGreater -m elf_i386
Run Command : $ ./IsGreater
Also please suggest the way to reuse the same "write" code block (i.e "Message" variable) to print the another string rather than declaring for new variable. ("AMessage" & "BMessage").
Thanks in advance.
Your program starts by jumping to write
.
Immediately following write
is exit
.
The program will just fall through.
It will not return to start
, because you did a jmp
.
It will just continue executing instructions.
Instead, you should use the call
instruction to call into write
, with a ret
inside write
to return to the caller.
About the second question, simply populate ecx
and edx
before calling write
, with the correct variables.
The write
function only needs to care about eax
, ebx
and issue the system call.
write:
mov eax, 4
mov ebx, 1
int 80h
ret
_start:
mov ecx, foo
mov edx, fooLength
call write
mov ecx, bar
mov edx, barLength
call write