我正在编写一个用户空间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&reserved_id=<?php echo $sel->id; ?>'" <?php }elseif($sel->table_type=='2'){ ?> onClick="javascript:location.href ='index.php?module=pos&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>
的基址寄存器。该值不会改变。
答案 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内核吗?