NASM - The Netwide Assembler
NASM Forum => Using NASM => Topic started by: Kyi Soe Thin on June 10, 2017, 03:57:23 AM
-
Hi
I started learning assembly language and I tested jmp instruction with a small program.
Here are my code
section .data
pointer dd one,two,three
dis1 dd "One"
dis2 dd "Two"
dis3 dd "Three"
lendis1 equ $-dis1
lendis2 equ $-dis2
lendis3 equ $-dis3
section .bss
var resd 1
section .text
global main
main:
mov eax,3
mov ebx,0
mov ecx,var
mov edx,1
int 80h
mov edx,var
mov eax,[pointer + edx*4]
jmp [eax]
one:
mov eax,4
mov ebx,1
mov ecx,dis1
mov edx,lendis1
int 80h
jmp exit
two:
mov eax,4
mov ebx,1
mov ecx,dis2
mov edx,lendis2
int 80h
jmp exit
three:
mov eax,4
mov ebx,1
mov ecx,dis3
mov edx,lendis3
int 80h
jmp exit
exit:
mov eax,1
int 80h
When I ran this as following
root@kalihost:~# nasm -f elf64 jump.asm
root@kalihost:~# gcc -o jump jump.o
root@kalihost:~# ./jump
1
Segmentation fault
root@kalihost:~#
root@kalihost:~#
Please find me the error.
-
I don't know anything about 64-bit code, but I know pointers are 64 bits!
What you've got there looks like pretty good 32-bit code. Mixing 64- and 32-bit code may not be a good idea. You might want to assemble it as 32-bit code, and tell gcc "-m32".
In any case, you're calculating the lengths wrong. Put the equs immediately after what you want the lengths of.
You need to convert stdin from characters to a number. You're using the address of "var" in your effective address.
My advice, if you're just beginning, would be to start with something simpler and take smaller steps.
Best,
Frank
-
I want to ask one more question.
Can jmp instruction be used with variable ?
For example,
section .data
pointer dw "one","two","three"
dis1 dd "one"
lendis1 equ $-dis1
dis2 dd "Two"
lendis2 equ $-dis2
dis3 dd "Three"
lendis3 equ $-dis3
section .bss
var resd 1
section .text
global main
main:
mov eax,3
mov ebx,0
mov ecx,var
mov edx,1
int 80h
mov eax,pointer
jmp eax
one:
mov eax,4
mov ebx,1
mov ecx,dis1
mov edx,lendis1
int 80h
jmp exit
two:
mov ecx,dis2
mov eax,4
mov ebx,1
mov edx,lendis2
int 80h
jmp exit
three:
mov eax,4
mov ebx,1
mov ecx,dis3
mov edx,lendis3
int 80h
jmp exit
exit:
mov eax,1
int 80h
Please help me.
-
I want to ask one more question.
Can jmp instruction be used with variable ?
Yes.
... not with random garbage in the variable, though.
Since this is mostly 32-bit code (64-bit uses "syscall" not "int 80h"), I tried it as 32 bit.
; nasm -f elf32 myprog.asm
; ld -m elf_i386 -o myprog myprog.o
section .data
pointer dd one,two,three
dis1 db "one"
lendis1 equ $-dis1
dis2 db "Two"
lendis2 equ $-dis2
dis3 db "Three"
lendis3 equ $-dis3
section .bss
var resd 1
section .text
global _start
_start:
mov eax,3
mov ebx,0
mov ecx,var
mov edx,1
int 80h
mov edi, [var]
sub edi, '0' ; convert character to number
dec edi ; pointer + 0 is "one"
mov eax,[pointer + edi * 4]
jmp eax
; or...
jmp [pointer + edi * 4]
one:
mov eax,4
mov ebx,1
mov ecx,dis1
mov edx,lendis1
int 80h
jmp exit
two:
mov ecx,dis2
mov eax,4
mov ebx,1
mov edx,lendis2
int 80h
jmp exit
three:
mov eax,4
mov ebx,1
mov ecx,dis3
mov edx,lendis3
int 80h
jmp exit
exit:
mov eax,1
int 80h
Works for me. It may not be what you have in mind...
Best,
Frank
-
Yesss, I get it.
It really works for me !!!
I really really thank you, Frank Kotler.