NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: muodostus on October 09, 2018, 01:24:30 AM
-
Hi,
I'm trying to learn assembly using Jeff Duntemann's excellent Assembly Language Step by Step, Third Edition: Programming with Linux. However, I'm having issues with unexpected data showing up in the Insight debugger (a front-end to GDB which diplays register and address contents) for example:
The code
section .data ; Section containing initialized data
section .text ; Section containing code
global _start ; Linker needs this to find the entry point (starting point labelled global)
_start:
nop ; This no-op keeps gdb happy
mov rax, 'WXYZ'
mov rbx, 'AAAA'
mov rcx, 'WXYZ'
mov rdx, 0004h
nop
; Put your experiments between the two nops
section .bss ; Section containing uninitialized data (seems to be optional to include)
Is resulting in registers containing:
RAX: 0xcc5958cc instead of the expected 0x5a595857
RBX: 0xcccccc41 instead of the expected 0x41414141
RCX: 0xcccccccc instead of 0x5a595857
and RDX: 0xcc0000cc instead of 0x00000004
Similarly, when I try:
_start:
nop ; This no-op keeps gdb happy
mov ax, 067FEh
mov bx, ax
mov cl, bh
mov ch, bl
nop
... I'm getting problematic output whether I try to move the initial number into AX, EAX, or RAX.
I've using a 64-bit Ubuntu running 18.04.1 LTS.
One of the things that seem to be problematic is insight doesn't seem to be processing 64 bit (it may be expecting a 32 bit since it converts my registers to EAX when I try to use RAX).
So, I tried using a different makefile (from the author's website: http://duntemann.com/assembly.html)
I changed from using:
sandbox: sandbox.o
ld -o sandbox sandbox.o
sandbox.o: sandbox.asm
nasm -f elf64 -g -F stabs sandbox.asm -l sandbox.lst
to
sandbox: sandbox.o
ld -o sandbox sandbox.o -melf_i386
sandbox.o: sandbox.asm
nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst
but, while that built, the debugger went into an infinite loop. :P
Before attempting that change at the command-line it seemed that the debugger is not stepping through the code correctly (misinterpreting opcode and mnemonics and resultingly producing garbage output).
I had some real basic ASM experience and an amatuerish level of C++ more than ten years ago; I'm not real well versed in Linux but would like to become eventually competent in all three of these. Anyway, if I have to throw away insight or modify it somehow what will be a good course to try to proceed through this book and onto programs that actually work on my linux distro (and have a debugger that maybe is better than gdb for assembly).
I suppose the real question is how to set up an environment that allows me to proceed through this book (and other tutorials). I'm contemplating getting a raspberry pi and learning ARM assembly instead... but in the meantime I'd like to work with this laptop and (complete and accessible -- if somewhat dated) textbook if possible.
Thanks in advance for any response.
-
I cannot help you with Insight or GDB. Jeff's page does not look encouraging for Insight. I happen to know that Jeff talked with Jeff Owens about debuggers. Jeff O. had "asmbug" and/or "minibug". Might help?
This is poor, but it does seem to display the expected number/ Any help at all?
; nasm -f elf64 myprog.asm
; ld -o myprog myprog.o
global _start
section .text
_start:
mov rax, "AAA"
call showraxh
mov al, 10 ; NL
call putc
exit:
mov rax, 60
mov rdi, 42
syscall
;--------
showraxh:
push rax
push rbx
push rcx
push rdx
mov rbx, rax
mov rdx, 16
.top:
rol rbx, 4
mov al, bl
and al, 0xF
add al, '0'
cmp al, '9'
jna .num
add al, 7
.num:
call putc
dec rdx
jnz .top
pop rdx
pop rcx
pop rbx
pop rax
ret
;----------
putc:
push rdx
push rsi
push rdi
push rax
mov rax, 1
mov rdi, 1
mov rsi, rsp
mov rdx, 1
syscall
pop rax
pop rdi
pop rsi
pop rdx
ret
;---------
Let us know if you have any success at all. 64 bit is not the best thing that happened to assembly language!
Good Luck,
Frank
-
Thank you. I'll definitely have a closer look at that, give it a whirl, and report back. :D
In the meantime, I found a couple other entry-level assembly tutorials and I'm looking to see if I can just use gdb to provide info on the registers and flags (to get run-time feedback that the code is doing what I expect). The PDF I'm working through instead right now is Programming from the Ground Up, version 1.0 -- which covers similar ground (geared to Linux users and explains things in-depth) but is using the AT&T syntax and the as assembler (which I view as an opportunity to get "multi-lingual" and flexible. 8) . As I get more practice I'll experiment with programs converted over to nasm too though.
BTW, it's awesome to see that there's a community available for people to get feedback with low-level programming. I think this, "systems" languages like C/Java, and scripted languages such as TCL, Ruby, and Python all have useful domains and each provide a lens so that folks aren't merely consumers of technology but active and productive engagers with it.