On 01/25/2010 04:39 PM, me wrote:
On Mon, 25 Jan 2010 12:18:51 +0800
Jie Zhang<jie.zhang@xxxxxxxxxx> wrote:
On 01/24/2010 10:51 PM, me wrote:
I'm trying to convert some 32 bit linked asm (which runs fine)
into 64 bit inline asm (g++) but am stumbling at the first hurdle
ie I'm getting -14 returned as the file descriptor for /dev/vcsa1.
Here's my attempt.
[code]
//My amd64 inline asm version
#include<iostream>
using namespace std;
void my_fn(){
const char * fl = "/dev/vcsa1";
const char * test_str = " "; //make same size as fl
int test_int = -1; //ie initialised to fail unless replaced by
value
//1 open /dev/vcsa1& return file descriptor in rax
__asm__ __volatile__(
".equ sys_open, 2\n"
".equ O_RDWR, 02\n"
"mov $sys_open, %%rax\n"
"mov $O_RDWR, %%rcx\n"
"mov $0600, %%rdx\n" //read/write for user in x86. Not sure for
AMD64? "syscall\n"
:"=b"(test_str), "=a"(test_int)
:"b"(fl)
This statement does not tell gcc the connections between registers
and C variables. So there is no guarantee that those variables will
be put into the registers you expect by the above statement.
Jie
I'm grateful for your comment but don't really understand it.
i.e. If...
:"=b"(test_str), "=a"(test_int)
:"b"(fl)
didn't connect the c variable "fl" to the register "rbx" then I'm not sure how
You need to take a look at this:
http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Extended-Asm.html#Extended-Asm
cout<< test_str
would be able to print "/dev/vcsa1" because the way the program works
it can only get this value from "rbx" suggesting that the two are connected.
I think it just happened by lucky.
Jie