Page 1 of 3

NASM to GAS assembly help

Posted: Tue Jun 18, 2024 6:44 pm
by TheGameMaker90
Hello, I hope I'm posting this in the right place. I was just wondering if there is a resource online that specializes in converting NASM syntax to GAS. I want to learn the GAS assembly because in OSDEV, inline assembly when using GCC as a compiler is very similar to it and I would prefer to keep things consistent in my code. I ask this rather than asking "how do I convert X to Y" for every component I don't understand.

Here is what I've tried thus far:
- Google search. I feel like google's search engine is getting dumber and dumber with time. I ask google for X, it gives me Z, W, and T.
- objdump -d test.asm. It dumps the contents in GAS syntax, butb when I put it in it loses some data.

Example:
-----------------------------------
test_func:
mov eax, ds:si
ret

I create the obj file with nasm -fefli386 test.asm -o test.o
It creates the object file. Then, I do objdump -d test.o
It outputs the following:
Disassembly of section .text:

00000000 <test_func>:
0: 3e 67 8b 04 mov %ds:(%si),%eax
4: c3 ret

So, I create test2.S. Do the same thing:
test_func:
mov %ds:(%si), %eax
ret

I basically put it as it appears in the terminal.
as --32 test2.S -o test2.o
objdump -d test2.o

This is what I get:
Disassembly of section .text:

00000000 <test_func>:
0: 67 8b 04 mov (%si),%eax
3: c3 ret

Notice anything? It loses opcode 3e which is %ds from what I can tell. Clearly, I am doing something wrong. I am more familiar with NASM syntax. But I need to be able to use GAS for consistency. Whoever is able to help me with this will be my hero, lol.

Additionally, would it be possible for somebody to tell me what the proper conversion is? Is that the proper conversion? Is it an assembler optimization? What is really going on here?

- Thanks

Re: NASM to GAS assembly help

Posted: Tue Jun 18, 2024 6:56 pm
by qookie
Losing the ds segment override prefix is fine in this case, because ds is already the segment register that's used for this instruction. It is an optimization, and I'm a bit surprised nasm doesn't do it.

Re: NASM to GAS assembly help

Posted: Tue Jun 18, 2024 7:00 pm
by TheGameMaker90
I kind of figured, thanks! But I still would like any and all resources that might help with conversions. After all, I used objdump with my memcmp and got this:

Disassembly of section .text:

00000000 <memcmp>:
0: 53 push %ebx
1: 8b 4c 24 10 mov 0x10(%esp),%ecx
5: 85 c9 test %ecx,%ecx
7: 74 2f je 38 <memcmp+0x38>
9: 8b 44 24 08 mov 0x8(%esp),%eax
d: 8b 54 24 0c mov 0xc(%esp),%edx
11: 01 c1 add %eax,%ecx
13: eb 0f jmp 24 <memcmp+0x24>
15: 8d 76 00 lea 0x0(%esi),%esi
18: 77 26 ja 40 <memcmp+0x40>
1a: 83 c0 01 add $0x1,%eax
1d: 83 c2 01 add $0x1,%edx
20: 39 c8 cmp %ecx,%eax
22: 74 14 je 38 <memcmp+0x38>
24: 0f b6 1a movzbl (%edx),%ebx
27: 38 18 cmp %bl,(%eax)
29: 73 ed jae 18 <memcmp+0x18>
2b: b8 ff ff ff ff mov $0xffffffff,%eax
30: 5b pop %ebx
31: c3 ret
32: 8d b6 00 00 00 00 lea 0x0(%esi),%esi
38: 31 c0 xor %eax,%eax
3a: 5b pop %ebx
3b: c3 ret
3c: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
40: b8 01 00 00 00 mov $0x1,%eax
45: 5b pop %ebx
46: c3 ret

Sorry for formatting. I literally copied it from my Linux VBox using guest additions. See the part where it says:
" 7: 74 2f je 38 <memcmp+0x38>"

I'm no expert with GAS, but thst doesn't seem like proper syntax.
Also, that might just prove GAS assembly is slightly better than NASM, lol

Edit:
Okay, so I was just looking at it again and realized these are jumps, meaning they would correspond to a label or an address somewhere. Is that accurate?

Re: NASM to GAS assembly help

Posted: Tue Jun 18, 2024 7:12 pm
by qookie
TheGameMaker90 wrote: Tue Jun 18, 2024 7:00 pm " 7: 74 2f je 38 <memcmp+0x38>"
objdump adds extra annotations to addresses to make it clearer what's going on, because it doesn't know about any local labels that existed in the original source code. Here, "je 38" is the actual instruction, with just the jump target address, and the "<memcmp+0x38>" part is telling you what that address corresponds to (in this case, a place within memcmp).

Re: NASM to GAS assembly help

Posted: Tue Jun 18, 2024 7:13 pm
by nullplan
If you for some reason need the 3e prefix, you can encode it directly:

Code: Select all

.byte 0x3e
mov (%si), %eax
But there are only very few situations in which that should be necessary. For example when you are making a table and need your code to be a certain length. Although you can always pad it with nops at the end as well.

BTW, please consider using a [ code ] tag next time. Makes the stuff more readable.
TheGameMaker90 wrote: Tue Jun 18, 2024 7:00 pmI'm no expert with GAS, but thst doesn't seem like proper syntax.
Basically all disassemblers display branches this way. Correct gas syntax would be something like

Code: Select all

je 1f
...
1:
Basically, you have the choice between macro labels and real labels. Macro labels consist only of a decimal number at the point of definition, and you can reuse them. At the point of usage, you have to additionally say if you want the label of that name that's defined earlier ("back", therefore b) or later ("forward", therefore f) in the file. All other labels work as you'd expect, with the important caveat that all labels that start with .L don't get put into the symbol table.

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 9:54 am
by TheGameMaker90
Ah, I see. Nope, I just wanted to know why it was missing on one but not the other. If it's not needed at a binary level, I won't put it. And alright. I didn't even remember the code tag. Been a while since I was here.

I've seen that technique used before. It can be any number (chronologically of course), right? And thank you! I was not aware that the f meant forward. I wasw always wondering about that one so you killed two birds. Here's what I'll do. I'll replace my memcmp written in C with GAS assebly based on your help and objdump and let you guys know how it went. Is there much of a performace difference? I can't imagine it would be substantial.

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 10:20 am
by TheGameMaker90
Okay, so I tried it with the following code:

Code: Select all

.globl memcmp
memcmp:
	push		%ebx
	mov		0x10(%esp), %ecx
	test		%ecx, %ecx
	je		1f
1:
	mov 		0x08(%esp), %eax
	mov		0x0C(%esp), %edx
	add		%eax, %edx
	jmp		2f
2:
	lea		0x00(%esi), %esi
	ja		3f
3:
	add 		$0x01, %eax
	add 		$0x01, %edx
	cmp		%ecx, %eax
	je		4f
4:	
	movzbl	(%edx), %ebx
	cmp 		%bl, (%ebx)
	jae		5f
5:
	mov 		$0xFFFFFFFF, %eax
	pop		%ebx
	ret
	lea		0x0(%esi), %esi
	xor		%eax, %eax
	pop 		%ebx
	ret

The problem is that when using it, the return value is always the same. str1 < str2. Obviously that is not ideal. I may have to look into the documentation of GAS assembly to fix this. I will keep trying. Unless any of you kind people have a fix. I woukd greatly appreciate a better exaample of using the labels and making this work. Thanks.

Edit: I wonder if this resource is going to be helpful...:
https://en.wikibooks.org/wiki/X86_Assem ... bly_syntax

Edit2:
Okay, upon reading up on that article I managed to get an output file that looks like this:

Code: Select all

	.file	"memcmp.c"
	.text
	.globl	memcmp
	.type	memcmp, @function
memcmp:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	subl	$16, %esp
	call	__x86.get_pc_thunk.ax
	addl	$_GLOBAL_OFFSET_TABLE_, %eax
	movl	8(%ebp), %eax
	movl	%eax, -8(%ebp)
	movl	12(%ebp), %eax
	movl	%eax, -4(%ebp)
	movl	$0, -12(%ebp)
	jmp	.L2
.L6:
	movl	-8(%ebp), %edx
	movl	-12(%ebp), %eax
	addl	%edx, %eax
	movzbl	(%eax), %edx
	movl	-4(%ebp), %ecx
	movl	-12(%ebp), %eax
	addl	%ecx, %eax
	movzbl	(%eax), %eax
	cmpb	%al, %dl
	jnb	.L3
	movl	$-1, %eax
	jmp	.L4
.L3:
	movl	-4(%ebp), %edx
	movl	-12(%ebp), %eax
	addl	%edx, %eax
	movzbl	(%eax), %edx
	movl	-8(%ebp), %ecx
	movl	-12(%ebp), %eax
	addl	%ecx, %eax
	movzbl	(%eax), %eax
	cmpb	%al, %dl
	jnb	.L5
	movl	$1, %eax
	jmp	.L4
.L5:
	addl	$1, -12(%ebp)
.L2:
	movl	-12(%ebp), %eax
	cmpl	16(%ebp), %eax
	jb	.L6
	movl	$0, %eax
.L4:
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	memcmp, .-memcmp
	.section	.text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
	.globl	__x86.get_pc_thunk.ax
	.hidden	__x86.get_pc_thunk.ax
	.type	__x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
.LFB1:
	.cfi_startproc
	movl	(%esp), %eax
	ret
	.cfi_endproc
.LFE1:
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
of which is similar to the objdump file with a few major differences. I'm not sure I need all that "junk" at the top and the "_GLOBAL_OFFSET_TABLE_" stuff or even the stuff here:

Code: Select all

.LFE0:
	.size	memcmp, .-memcmp
	.section	.text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
	.globl	__x86.get_pc_thunk.ax
	.hidden	__x86.get_pc_thunk.ax
	.type	__x86.get_pc_thunk.ax, @function
but I could be wrong. If somebody would point me in the right direction, it would be helpful.

Edit 3: Good news my fellow OSDevs and software engineers! I have managed to remove said junk and effectively rewritten the memcmp function in GAS assembly! Here is my result (I will be changing the label names):

Code: Select all

	.code32
	.text
	.globl memcmp
memcmp:
	push		%ebp
	movl		%esp, %ebp
	subl		$16, %esp
	movl		8(%ebp), %eax
	movl 	%eax, -8(%ebp)
	movl		12(%ebp), %eax
	movl		%eax, -4(%ebp)
	movl		$0, -12(%ebp)
	jmp		.L2
.L6:
	movl		-8(%ebp), %edx
	movl		-12(%ebp), %eax
	addl		%edx, %eax
	movzbl	(%eax), %edx
	movl		-4(%ebp), %ecx
	movl		-12(%ebp), %eax
	addl		%ecx, %eax
	movzbl	(%eax), %eax
	cmpb	%al, %dl
	jnb		.L3
	movl		$-1, %eax
	jmp		.L4
.L3:
	movl		-4(%ebp), %edx
	movl		-12(%ebp), %eax
	addl		%edx, %eax
	movzbl	(%eax), %edx
	movl		-8(%ebp), %ecx
	movl		-12(%ebp), %eax
	addl		%ecx, %eax
	movzbl	(%eax), %eax
	cmpb	%al, %dl
	jnb		.L5
	movl		$1, %eax
	jmp 		.L4
.L5:
	addl		$1, -12(%ebp)
.L2:
	movl		-12(%ebp), %eax
	cmpl		16(%ebp), %eax
	jb		.L6
	movl		$0, %eax
.L4:
	leave
	ret
If there's any changes or optimizations you see that I could/should make, let me know and I will add your name to the list of contributers on my GitHub repository: https://github.com/PsionixSoftworks/Adamantium.

- Thanks

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 11:28 am
by nullplan
TheGameMaker90 wrote: Wed Jun 19, 2024 10:20 am

Code: Select all

je		1f
1:
This and all of the other jumps in the code are effectively nops. They all jump to the next instruction if the condition passes, so they do the same thing in both cases.

I converted the code a bit more accurately into assembler source code:

Code: Select all

    push %ebx
    mov 0x10(%esp),%ecx
    test %ecx,%ecx
    je 3f
    mov 0x8(%esp),%eax
    mov 0xc(%esp),%edx
    add %eax,%ecx
    jmp 2f
    lea 0x0(%esi),%esi
1:
    ja 4f
    add $0x1,%eax
    add $0x1,%edx
    cmp %ecx,%eax
    je 3f
2:
    movzbl (%edx),%ebx
    cmp %bl,(%eax)
    jae 1b
    mov $0xffffffff,%eax
    pop %ebx
    ret
    lea 0x0(%esi),%esi
3:
    xor %eax,%eax
    pop %ebx
    ret
    lea 0x0(%esi,%eiz,1),%esi
4:
    mov $0x1,%eax
    pop %ebx
    ret
TheGameMaker90 wrote: Wed Jun 19, 2024 10:20 am Okay, upon reading up on that article I managed to get an output file that looks like this:
That looks suspiciously like GCC output. GCC is of course not going to write assembler in a style you would use. Unless you often call your labels ".LC0" and the like.

To answer your further questions: Everything starting with a . is a pseudo-instruction. It instructs the assembler to do something (other than to assemble an instruction). All the ones starting with ".cfi" are call frame information directives. They generate data for the .eh_frame section, so if your code gets interrupted asynchronously, the unwinder knows how to unwind through the function. For your purposes, you can entirely ignore those.

The _GLOBAL_OFFSET_TABLE_ exists for position independent code. But the code is really dumb, since after calculating the pointer in EAX (probably wrongly) it gets overwritten immediately. This makes me think you were not compiling on the highest optimization level. That also makes the entire "get_pc_thunk.ax" thing uninteresting to talk about. It is a thing that GCC puts into position-independent builds on i386: In order to get the address of the global offset table, you have to find your current runtime address. On architectures without PC-relative addressing, like i386, this is done with a self-call:

Code: Select all

   call 1f
1: pop %eax # now EAX contains the runtime address of label 1
   add $_GLOBAL_OFFSET_TABLE_-1b, %eax # now EAX contains the runtime address of the GOT
However, some processors don't like mismatched call and ret instructions. Apparently, the clang people don't care, but the GCC people invented the whole "get_pc_thunk" thing, where the compiler generates a function that only reads the return pointer into a register and returns. So instead of call+pop, it does.

Code: Select all

func: mov (%esp), %eax
ret
...
call func
1:# now EAX contains the runtime address of label 1
This is marked as a linkonce function, so it can be defined multiple times, and the linker will then discard all but one copies of it (they are all going to be equal anyway).

But it is not sensible to establish a GOT pointer in a function that doesn't call any other functions or references any static memory. So this should probably have been removed, and the compiler would likely have done that at a higher optimization level.

BTW, here's how I would do it:

Code: Select all

memcmp:
  pushl %esi
  pushl %edi
  movl 12(%esp), %esi
  movl 16(%esp), %edi
  movl 20(%esp), %ecx
  testl %ecx, %ecx
  jz .Lret0
1:
  movzbl (%esi), %eax
  movzbl (%edi), %edx
  subl %edx, %eax
  jnz .Lret
  incl %esi
  incl %edi
  decl %ecx
  jnz 1b
.Lret0:
  xorl %eax, %eax
.Lret:
  popl %edi
  popl %esi
  retl

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 1:50 pm
by TheGameMaker90
Thank you for the detailed explanation! I would give you the rest of the .S files to convert, but if you really want to help, I've linked the GitHub repository in my last post. As mentioned, I will add your name to the list of contributers if you do so. But the commit has to be done by you. Also, I can't find it anywhere, but how do you pass parameters in GAS assembly? I found a resource a long time ago with help on it, but I can't seem to find it.

basically, I'm trying to do the equivalent of this:

Code: Select all

mov eax, [esp+4]
in gas. I can't seem to figure it out. I've tried

Code: Select all

movl 4(%esp), %eax

movl -4(%esp), %eax

movl 8(%esp), %eax
and most other combinations you might think of. objdump doesn't give me the help I need and I am trying to get the GDT pointer passed in as a parameter to my gtd_install code.

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 2:27 pm
by Octocontrabass
TheGameMaker90 wrote: Wed Jun 19, 2024 9:54 amIs there much of a performace difference? I can't imagine it would be substantial.
If you're replicating your compiler's output in assembly, you'll get the same binary, so there won't be any difference in performance. (And if you're just going to get the same binary anyway, why bother rewriting the code in assembly in the first place?)
TheGameMaker90 wrote: Wed Jun 19, 2024 1:50 pmAlso, I can't find it anywhere, but how do you pass parameters in GAS assembly?
Same way you do in NASM assembly. Parameter passing depends on the ABI, not the assembler syntax.
TheGameMaker90 wrote: Wed Jun 19, 2024 1:50 pmbasically, I'm trying to do the equivalent of this:

Code: Select all

mov eax, [esp+4]
in gas. I can't seem to figure it out. I've tried

Code: Select all

movl 4(%esp), %eax
The first one you listed is equivalent to the NASM syntax. But it'll only work if this is the correct way to access the parameter you're passing, and you didn't say what kind of parameter it is.

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 3:31 pm
by TheGameMaker90
Octocontrabass wrote: Wed Jun 19, 2024 2:27 pm
TheGameMaker90 wrote: Wed Jun 19, 2024 9:54 amIs there much of a performace difference? I can't imagine it would be substantial.
If you're replicating your compiler's output in assembly, you'll get the same binary, so there won't be any difference in performance. (And if you're just going to get the same binary anyway, why bother rewriting the code in assembly in the first place?)
TheGameMaker90 wrote: Wed Jun 19, 2024 1:50 pmAlso, I can't find it anywhere, but how do you pass parameters in GAS assembly?
Same way you do in NASM assembly. Parameter passing depends on the ABI, not the assembler syntax.
TheGameMaker90 wrote: Wed Jun 19, 2024 1:50 pmbasically, I'm trying to do the equivalent of this:

Code: Select all

mov eax, [esp+4]
in gas. I can't seem to figure it out. I've tried

Code: Select all

movl 4(%esp), %eax
The first one you listed is equivalent to the NASM syntax. But it'll only work if this is the correct way to access the parameter you're passing, and you didn't say what kind of parameter it is.
I know that, I just mean that if it was modified. So if I found a similar way to do it in GAS assembly, it probably wouldn't get much more efficient because it can only be optimized so much before you're just trying to perfect perfection.

Yes, that's why I said "i'm trying to do the equivalent of this." in other words, I want to do that but in GAS. And the syntax is important. Am I right that a digit has to go before the '(' in the expression? If not, what should it look like I mean. I can't just write it as it appears in NASM assembly. That wouldm produce an error. So my question is how are parameters formatted in GAS assembly. I merely put that there so somebody could give me the translation. And the parameter is of type 32-bit integer. It's literally just loading the GDT pointer in GAS assembly. I have the segments setup and

Code: Select all

lgdt (%eax)
in place, but getting the pointer to the GDT is what I am trying to do. This is a new OS I'm working on. Just started a few days ago and the system keeps restarting every time I hit enter on the GRUB boot menu.

Re: NASM to GAS assembly help

Posted: Wed Jun 19, 2024 6:14 pm
by Octocontrabass
TheGameMaker90 wrote: Wed Jun 19, 2024 3:31 pmI know that, I just mean that if it was modified. So if I found a similar way to do it in GAS assembly, it probably wouldn't get much more efficient because it can only be optimized so much before you're just trying to perfect perfection.
You have to measure to know for sure, but I wouldn't be surprised if you could make it a bit faster by reducing it to fewer instructions. For example, nullplan combined the comparison and the return value calculation into a single SUB instruction.
TheGameMaker90 wrote: Wed Jun 19, 2024 3:31 pmAm I right that a digit has to go before the '(' in the expression?
Yes, the displacement goes before the "(" in an address operand.
TheGameMaker90 wrote: Wed Jun 19, 2024 3:31 pmSo my question is how are parameters formatted in GAS assembly.
Memory operands in AT&T syntax are formatted as "displacement(%base,%index,scale)". You must specify them in that order, though you can leave out the parts you aren't using. The equivalent in NASM syntax would be something like "[base+index*scale+displacement]", although NASM will allow you to specify them in whatever order you like as long as it's algebraically equivalent. (NASM will even accept things like "[eax*3]" since it's equivalent to "[eax+eax*2]".)
TheGameMaker90 wrote: Wed Jun 19, 2024 3:31 pmAnd the parameter is of type 32-bit integer.
Then yes, assuming you haven't done anything that would change ESP like pushing stuff onto the stack, that's the correct instruction.
TheGameMaker90 wrote: Wed Jun 19, 2024 3:31 pmJust started a few days ago and the system keeps restarting every time I hit enter on the GRUB boot menu.
It's usually helpful to run QEMU with "-d int" (and also "-no-reboot") when you're trying to figure out a triple fault.

Re: NASM to GAS assembly help

Posted: Tue Jun 25, 2024 10:46 am
by TheGameMaker90
Awesome, thanks for all of the tips! And thanks for showing me that trick with the debug flag. It actually shows me things like GDT = and the value stored at that memory location. At the bottom however, there is something I'm unfamiliar with:

check_exception old: 0x8 new 0xd

What does that mean? Should I be long jumping to 0x0D instead of 0x08 in my GDT? Or something else? Also, if I wanted to dothe whole GDT in GAS assembly, how would I get the GDT pointer? Here is my code:

Code: Select all

.code16
.text
.globl gdt_pointer
gdt_start:
	.long	0x0
gdt_code:
	.word	0xFFFF
	.word	0x0000
	.byte	0x00
	.byte	0x9A
	.byte	0xCF
	.byte	0x00
gdt_data:
	.word	0xFFFF
	.word	0x0000
	.byte	0x00
	.byte	0x92
	.byte	0xCF
	.byte	0x00
gdt_end:
gdt_pointer:
To my understanding, it is the equivalent of:

Code: Select all

gdt_start:
    dq 0x0
gdt_code:
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 0x9A
    db 0xCF
    db 0x00
gdt_data:
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 0x92
    db 0xCF
    db 0x00
gdt_end:
gdt_pointer:
    dw gdt_end - gdt_start
    dd gdt_start
yes? If so, how would I do the part under gdt_pointer? (Perhaps it will be easier than trying to load the GDT from C into an assembly function).

Re: NASM to GAS assembly help

Posted: Tue Jun 25, 2024 12:14 pm
by Octocontrabass
TheGameMaker90 wrote: Tue Jun 25, 2024 10:46 amcheck_exception old: 0x8 new 0xd

What does that mean?
It means the CPU tried to jump to the exception handler for a double fault (0x8) but there was a problem that caused a general protection fault (0xd). Since you don't have an IDT yet, that's not surprising. The previous entry in the log should be the double fault, and before that should be the exception you're trying to debug.
TheGameMaker90 wrote: Tue Jun 25, 2024 10:46 amyes?
No, it's not equivalent. You need to use ".quad" instead of ".long".
TheGameMaker90 wrote: Tue Jun 25, 2024 10:46 amIf so, how would I do the part under gdt_pointer?
The same way you did it with NASM, just replace "dw" and "dd" with the GAS equivalents.
TheGameMaker90 wrote: Tue Jun 25, 2024 10:46 am(Perhaps it will be easier than trying to load the GDT from C into an assembly function).
If you're having this much trouble passing a parameter from C to assembly, you might have a bug somewhere else in your code.

Re: NASM to GAS assembly help

Posted: Tue Jun 25, 2024 12:22 pm
by TheGameMaker90
Thanks, I will change it to .quad, and...
If I knew the gas equivalent, the topic wouldn't be called nasm to gas assembly help, lol.

Edit:
Okay, so with a bit of research, I managed to (hopefully) figure it out. However, with the debug output from qemu, the GDT is all 0's. Like here's what it says for GDT:
GDT= 00000000 00000000
I assume that means it's not installed. Here is my updated code:

Code: Select all

	.code32
	.text
	.globl gdt_install
gdt_start:
	.quad	0x0
gdt_code:
	.word	0xFFFF
	.word	0x0000
	.byte	0x00
	.byte	0x9A
	.byte	0xCF
	.byte	0x00
gdt_data:
	.word	0xFFFF
	.word	0x0000
	.byte	0x00
	.byte	0x92
	.byte	0xCF
	.byte	0x00
gdt_end:
gdt_pointer:
	.word 	gdt_end - gdt_start
	.long 	gdt_start
gdt_install:
	movl 	$gdt_pointer, %eax
	lgdt 	(%eax)
	movw 	$0x10, %ax
	movw 	%ax, %ds
	movw 	%ax, %es
	movw 	%ax, %fs
	movw 	%ax, %gs
	movw 	%ax, %ss
	ljmp	$0x08, $.finish
.finish:
	ret
The gdt_install label is then called externally and used in my main.c (actually init/kernel.c) file:

Code: Select all

...
extern void gdt_install(void);
...
int main(unsigned long magic, unsigned long addr)
{
	...
	gdt_install();
	...
	return EXIT_SUCCESS;
}
To no avail. It doesn't triple fault anymore, but I think that's just because it's not finding the GDT at all...
oddly enough, under IDT (which I haven't even begun working on) says:
IDT= 00000000 000003ff
and LDT (which I also haven't created [yet]):
LDT=0000 00000000 0000ffff 00008200

Edit2:
Okay, I just noticed the list of output symbols is longer than santa's christmas list. There is a repeating pattern of things. I'llpaste the full output of the debug $#!+. Brace yourselves:

EAX=00000001 EBX=00000000 ECX=02000000 EDX=02000628
ESI=0000000b EDI=02000000 EBP=00014900 ESP=00006c5c
EIP=000e9bb1 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00cf9b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00cf9300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000080 CCD=00000001 CCO=LOGICB
EFER=0000000000000000
SMM: after RSM
EAX=00000001 EBX=00000000 ECX=02000000 EDX=02000628
ESI=0000000b EDI=02000000 EBP=00014900 ESP=00006c5c
EIP=000e9bb1 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=00006cff
ESI=00006cb8 EDI=07fbec71 EBP=00006c78 ESP=00006c78
EIP=00007d29 EFL=00000006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 008f9300
CS =f000 000f0000 ffffffff 008f9b00
SS =0000 00000000 ffffffff 008f9300
DS =0000 00000000 ffffffff 008f9300
FS =0000 00000000 ffffffff 008f9300
GS =0000 00000000 ffffffff 008f9300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=00006c78 CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=00006cff
ESI=00006cb8 EDI=07fbec71 EBP=00006c78 ESP=00006c78
EIP=000f7d2a EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=07fa91c0
ESI=000e8d00 EDI=07fbec71 EBP=00006c78 ESP=00006c78
EIP=000f7d43 EFL=00000012 [----A--] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000010 CCD=00006c64 CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=07fa91c0
ESI=000e8d00 EDI=07fbec71 EBP=00006c78 ESP=00006c78
EIP=00007d44 EFL=00000006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =0000 00000000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000004 CCD=00000001 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=0000699e EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=00007d29 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 008f9300
CS =f000 000f0000 ffffffff 008f9b00
SS =0000 00000000 ffffffff 008f9300
DS =0000 00000000 ffffffff 008f9300
FS =0000 00000000 ffffffff 008f9300
GS =ca00 000ca000 ffffffff 008f9300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=0000695e CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=0000699e EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=000f7d2a EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000005
ESI=00000000 EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=000f7d43 EFL=00000012 [----A--] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000010 CCD=0000694a CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000005
ESI=00000000 EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=00007d44 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000001 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=00006998 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=00007d29 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00006958 CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=00006998 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=000f7d2a EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000003
ESI=07f8b590 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=000f7d43 EFL=00000016 [----AP-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000014 CCD=00006944 CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000003
ESI=07f8b590 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=00007d44 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000001 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=0000699e EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=00007d29 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=0000695e CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=0000699e EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=000f7d2a EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000005
ESI=00000000 EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=000f7d43 EFL=00000012 [----A--] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000010 CCD=0000694a CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000005
ESI=00000000 EDI=07fbec71 EBP=0000695e ESP=0000695e
EIP=00007d44 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000001 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=00006998 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=00007d29 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00006958 CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=000f7d2a ECX=00001234 EDX=000069ff
ESI=00006998 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=000f7d2a EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000000 CCO=EFLAGS
EFER=0000000000000000
SMM: enter
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000003
ESI=07ecb590 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=000f7d43 EFL=00000016 [----AP-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
CS =0008 00000000 ffffffff 00c09b00 DPL=0 CS32 [-RA]
SS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
DS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
FS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
GS =0010 00000000 ffffffff 00c09300 DPL=0 DS [-WA]
LDT=0000 00000000 0000ffff 00008200 DPL=0 LDT
TR =0000 00000000 0000ffff 00008b00 DPL=0 TSS32-busy
GDT= 000f6180 00000037
IDT= 000f61be 00000000
CR0=00000011 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000014 CCD=00006944 CCO=EFLAGS
EFER=0000000000000000
SMM: after RSM
EAX=000000b5 EBX=00007d44 ECX=00005678 EDX=00000003
ESI=07ecb590 EDI=07fbec71 EBP=00006958 ESP=00006958
EIP=00007d44 EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =d980 000d9800 ffffffff 00809300
CS =f000 000f0000 ffffffff 00809b00
SS =0000 00000000 ffffffff 00809300
DS =0000 00000000 ffffffff 00809300
FS =0000 00000000 ffffffff 00809300
GS =ca00 000ca000 ffffffff 00809300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT= 00000000 00000000
IDT= 00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000
DR6=ffff0ff0 DR7=00000400
CCS=00000000 CCD=00000001 CCO=EFLAGS
EFER=0000000000000000