c程序中的asm指令替代

时间:2015-06-02 12:04:58

标签: c assembly

我正在编写一个用户空间C程序来读取硬盘。

我需要将汇编程序指令转换为C程序代码。如何才能做到这一点?

eax

此处rsi可以是任何变量。但是,0xc1617000是值为<td><button id="table-<?php echo $tables->id; ?>" type="button" value="<?php echo $tables->id; ?>" class="table-<?php echo $tables->id; ?>" ondrop="drop(event)" ondragenter="dragEnter(event)" ondragleave="dragLeave(event)" ondragover="allowDrop(event)" <?php foreach($table_selected as $sel){ if($sel->tableid==$tables->id){ if($sel->table_type=='1'){ ?> ondragstart="dragStart(event)" draggable="true" id="dragtarget" style="background-color:yellow;border: 1px yellow;width:170px;height:50px;" onClick="javascript:location.href ='index.php?module=pos&amp;reserved_id=<?php echo $sel->id; ?>'" <?php }elseif($sel->table_type=='2'){ ?> onClick="javascript:location.href ='index.php?module=pos&amp;reserved_id=<?php echo $sel->id; ?>'" style="background-color:green;border: 1px green;width:170px;height:50px;" <?php } } } ?> style="width:170px;height:50px;" name="<?php echo $tables->table_name; ?>"><span><span><?php echo $tables->table_name; ?></span></span></button></td> 的基址寄存器。该值不会改变。

2 个答案:

答案 0 :(得分:1)

您可以为C中的指针指定值。试试这个:

uint8_t *rsi = (uint8_t*)(uintptr_t) 0xc1617000; // The uintptr_t cast isn't really needed, but might help portability.
uint32_t value = *(uint32_t *)(rsi + 0x0C);

较短的版本当然是:

uint32_t value = *(uint32_t *)0xc161700C;

基本上你将该常量解释为指向uint32_t的指针,然后取消引用它。

答案 1 :(得分:1)

关注http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

mov eax, [rsi+0x0C]

表示

将地址rsi+0x0C的4字节字移至EAX寄存器

这就是这行汇编程序的意思;你说

  

这里的eax可以是任何变量

通常,EAX是某些函数的返回值,但我不会进入此。

因为这是微不足道的:

int variable = *((unsigned int*) 0xc161700C; 

请注意,完全取决于您的编译器是否实际复制了该值 - 在许多情况下,编译器只有在实际使用variable的值时才能执行此操作。如果要求variable的地址,您可能要么获得新地址,要么实际0xc161700C

由于这是基本的C,我不太自信我想让你玩我的硬盘驱动器;)请注意,对于在非特权(非内核模式)下运行的程序,一般不可能访问物理内存地址

修改

  

在Linux上,程序在访问该位置时崩溃。可能是因为它超出了进程内存的界限。知道如何访问进程内存范围之外的内存

正如我在这里和评论中所说: 如果您的代码作为程序运行(在 userland 中),则永远不能访问原始物理内存地址。您的进程看到了自己的内存,物理内存被映射到页面中 - 没有内核模式的帮助就无法访问原始物理内存。这就是在任何现代CPU上完成的内存映射的美丽:程序不能直接使用硬件。

在Linux下,事情可能相对简单:以root身份打开或mmap /dev/mem并访问该文件中的正确位置 - 这是对操作系统可访问的内存的直接访问的模拟

然而,你正在做的事情是危险的,Linux通常已经支持了它应该的AHCI - 你确定你已经在使用过去十年的Linux内核吗?