查看以下汇编代码:
MOV ESI, DWORD PTR [EBP + C]
MOV ECX, EDI
MOV EAX, EAX
SHR ECX, 2
LEA EDI, DWORD PTR[EBX + 18]
REP MOVS DWORD PTR ES:[EDI], DWORD PTR [ESI]
MOV ECX, EAX
AND ECX, 3
REP MOVS BYTE PTR ES:[EDI], BYTE PTR[ESI]
Run Code Online (Sandbox Code Playgroud)
我得到代码摘录的书解释了第一个REP MOVS
复制4字节块,第二个REP MOVS
复制剩余的2字节块(如果存在).
REP MOVS
说明书如何运作?根据MSDN,"该指令可以用REP作为前缀,重复操作ecx寄存器指定的次数." 难道不会一遍又一遍地重复同样的操作吗?
我有2个申请.示例App1和App2运行时,正常App1将显示程序集可执行位置.但是当我从App2调用App1时,它返回App2启动位置.
那么,当从App2调用App1时,如何让App1启动路径?
我有一个.NET 4.5应用程序,在大多数环境中都可以正常运行和运行; 但是,应用程序的一个区域会在某些客户端计算机上引发运行时程序集引用错误:
Could not load file or assembly 'System.Xml.Linq, Version 4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The file cannot be accessed by the system. (Exception from HRESULT: 0x80070780)
Run Code Online (Sandbox Code Playgroud)
我运行了融合日志,有趣的是,这个程序集似乎加载了两次,一次加载版本4.0.0.0,然后加载版本3.5.0.0加载Newtonsoft.Json版本6.0.8.第一个加载工作,第二个是绑定错误的来源.
以下是成功4.0.0.0绑定的Fusion日志:
<meta http-equiv="Content-Type" content="charset=unicode-1-1-utf-8"><!-- saved from url=(0015)assemblybinder: --><html><pre>
*** Assembly Binder Log Entry (1/16/2017 @ 12:40:06 PM) ***
The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable C:\Users\<user>\AppData\Local\Apps\MyApplicationPath\MyApplication.exe
--- A detailed error log follows.
=== Pre-bind …
Run Code Online (Sandbox Code Playgroud) 所以我在一段时间后自学了x86程序集,只是在C++中使用内联汇编.
所以我想做的是在函数参数,传入数组,索引(unsigned int)和数字.使用程序集,它会将数组的内存位置中的值更改为传入的值.所以代码看起来像这样.
inline void Set( int pArray[], unsigned int pIndex, int pNum ) {
__asm {
mov ebx, pIndex
mov eax, 4
mul ebx
mov ebx, pNum
lea edi, pArray
mov [ edi + eax ], ebx
}
}
int main() {
int myArray[ 5 ] = { 1, 2, 3, 4, 5 };
Set( myArray, 2, 7 );
std::cout << myArray[ 2 ] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
所以代码应该加载数组地址的开头,获取索引并将其乘以4,以便内存位置移动那么多字节,然后将其更改为传入的值.但是,当我这样做时,值保持不变.这是为什么?出了什么问题?
我尝试使用ptrace解析可执行文件中的所有Calls和Rets.符合x64opcode,我找到了调用的操作码:0xe8和Rets:0xc3,0xc2,0xca,0xcb.
自从我解析它们后,我发现了更多的Rets而不是Calls.
有我跟踪的程序:
void func()
{
write(1, "i", 1);
}
int main(int ac)
{
func();
return(0);
}
Run Code Online (Sandbox Code Playgroud)
有我的示踪剂:
int tracer(t_info *info)
{
int status;
long ptr;
int ret = 0;
int call = 0;
waitpid(info->pid, &status, 0);
while (WIFSTOPPED(status))
{
ptrace(PTRACE_GETREGS, info->pid, NULL, info->regs);
ptr = ptrace(PTRACE_PEEKDATA, info->pid, info->regs->rip);
if (((ptr & 0x000000ff) == 0xe8)) // Opcode for call
{
call++;
}
else if (((ptr & 0x000000ff) == 0xc3) // Opcodes for …
Run Code Online (Sandbox Code Playgroud) 以下是示例程序的objdump输出,
080483b4 <display>:
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
80483b7: 83 ec 18 sub $0x18,%esp
80483ba: 8b 45 0c mov 0xc(%ebp),%eax
80483bd: 89 44 24 04 mov %eax,0x4(%esp)
80483c1: 8d 45 fe lea 0xfffffffe(%ebp),%eax
80483c4: 89 04 24 mov %eax,(%esp)
80483c7: e8 ec fe ff ff call 80482b8 <strcpy@plt>
80483cc: 8b 45 08 mov 0x8(%ebp),%eax
80483cf: 89 44 24 04 mov %eax,0x4(%esp)
80483d3: c7 04 24 f0 84 04 08 movl $0x80484f0,(%esp)
80483da: e8 e9 fe ff …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从保存在数据中的单词加载一个字节:
.data
number:
.word w1
Run Code Online (Sandbox Code Playgroud)
.text的一部分:
stringlength:
li $t2, 10
li $t1, -1
la $a0, number
loop:
addiu $t1, $t1, 1
lb $t0, $t1($a0)
bne $t0, $t2, loop
move $v0, $t1
jr $ra
Run Code Online (Sandbox Code Playgroud)
*代码未完成
我的问题是,
lb $t0, $t1($a0)
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现一个动态偏移,它将增加1,检查字符串中的每个字节,检查它是否等于10(dec).
QtSPIM引发关于此行的异常语法错误,
这样做的正确方法是什么?
我目前正在研究一个项目,碰巧我必须颠倒一个字节的顺序.我目前正在使用AVR Studio Mega32微控制器.
例如:
0000 0001 becomes 1000 0000
0001 0110 becomes 0110 1000
1101 1001 becomes 1001 1011
Run Code Online (Sandbox Code Playgroud)
首先,我有这个:
ldi r20,0b00010110
Run Code Online (Sandbox Code Playgroud)
反转字节的最简单方法是什么,使r20变为01101000?
我正在编写代码来临时使用我自己的堆栈进行实验.这在我使用文字内联汇编时起作用.我将变量位置硬编码为ebp的偏移量.但是,我希望我的代码可以不用硬编码内存地址,所以我一直在研究GCC的扩展内联汇编.我所拥有的是以下内容:
volatile intptr_t new_stack_ptr = (intptr_t) MY_STACK_POINTER;
volatile intptr_t old_stack_ptr = 0;
asm __volatile__("movl %%esp, %0\n\t"
"movl %1, %%esp"
: "=r"(old_stack_ptr) /* output */
: "r"(new_stack_ptr) /* input */
);
Run Code Online (Sandbox Code Playgroud)
这一点是首先将堆栈指针保存到变量old_stack_ptr中.接下来,堆栈指针(%esp)将被我在new_stack_ptr中保存的地址覆盖.
尽管如此,我发现GCC将%esp保存到old_stack_ptr中,但是没有用new_stack_ptr替换%esp.经过深入检查,我发现它实际上扩展了我的程序集并添加了它自己的指令,如下所示:
mov -0x14(%ebp),%eax
mov %esp,%eax
mov %eax,%esp
mov %eax,-0x18(%ebp)
Run Code Online (Sandbox Code Playgroud)
我认为GCC正试图保留%esp,因为我没有将它明确声明为"输出"操作数......我可能完全错了...
我真的很想使用扩展的内联汇编来实现这一点,因为如果没有,似乎我必须将%ebp的位置偏移"硬编码"到程序集中,我宁愿使用像这样的变量名.特别是因为这个代码需要在几个不同的系统上工作,这些系统似乎都以不同的方式抵消了我的变量,所以使用扩展的内联汇编允许我明确地说出变量位置......但是我不明白为什么它会这样做额外的东西,不要让我像以前一样覆盖堆栈指针,自从我开始使用扩展程序集以来,它一直在这样做.
我感谢任何帮助!
我的C#应用程序server.exe
对我的业务运营至关重要,理想情况下需要24/7不间断地运行.代码是坚如磐石的,但是我无法控制的一件事是由第三方生成的入站数据源质量差.我偶尔会收到包含异常的数据Feed,在这种情况下我必须:
server.exe
以适应异常server.exe
使用新代码重新启动,并允许处理语法上有缺陷的feed整个过程通常需要不到几分钟,但重新启动server.exe
会导致某些非关键状态信息的重置,更糟糕的是,会导致外部进程中断,这取决于server.exe.
我的目标:将Feed处理代码隔离到一个单独的DLL中,其内容可以在不重新启动的情况下进行更新server.exe
. 我该怎么做呢?
请允许我解释一下我在撰写此论坛帖子之前所做的工作:
Feed进程处理器界面已移至名为的新程序集common.dll
.界面看起来像这样:
public interface IFeedProcessor{
bool ProcessFeed(String filePath); //returns false on failure, true on success
}
Run Code Online (Sandbox Code Playgroud)
Server.exe
现在参考common.dll
.
Feed进程本身已被移动到一个名为的新程序集feedProcessors.dll
.实现看起来像这样:
internal class FeedProcessor1:IFeedProcessor{
public FeedProcessor1(){}
bool ProcessFeed(String filePath){/*implementation*/return true;}
}
internal class FeedProcessor2:IFeedProcessor{
public FeedProcessor2(){}
public bool ProcessFeed(String filePath){/*implementation*/return true;}
}
[... and so on...]
Run Code Online (Sandbox Code Playgroud)
feedProcessors.dll
还包含一个名为的类FeedProcessorUtils
,用于根据某些配置输入创建特定的Feed处理程序.它看起来像这样:
public class FeedProcessorUtils{
public static void CreateFeedProcessor(int feedType …
Run Code Online (Sandbox Code Playgroud) assembly ×7
x86 ×4
c# ×3
.net ×2
c ×2
arrays ×1
atmega ×1
avr ×1
byte ×1
c++ ×1
executable ×1
gcc ×1
linux ×1
machine-code ×1
mips ×1
ptrace ×1
reverse ×1
system.xml ×1
windows-10 ×1
x86-64 ×1