非常自我解释的代码.为什么不起作用!
#include <stdio.h>
int main() {
__asm__("number dw 0"); // declare number?
printf("%d",number);
__asm__("mov %eax,number"
"inc %eax"
"mov number,%eax");
printf("%d",number);
return 0;
}
cc ex1.c -o ex1
ex1.c: In function ‘main’:
ex1.c:22:17: error: ‘number’ undeclared (first use in this function)
ex1.c:22:17: note: each undeclared identifier is reported only once for each function it appears in
make: *** [ex1] Error 1
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有很多知识空白要填补... gcc手册让我对内联汇编问题感到困惑,谷歌搜索教程结果......
在intel i7处理器上工作
我正在开发一个与Web服务连接的客户端应用程序,为了做到这一点,我使用WebClient类和JavaScriptSerializer类将请求的字符串解析为JSON.
我不得不从System.Web.Extensions.dll添加一个引用,使第二个工作,并且工作得很好但是如果我将我的exe文件移动到其他计算机显然会抛出我无法找到dll的异常.我试图将System.Web.Extensions.dll复制到我的应用程序的bin文件夹并再次添加引用,但它似乎无法正常工作..
我想要做的很简单,我想把我的exe文件的路径引用的dll,然后我一直迁移文件,我希望程序通过相对路径加载dll.
说真的,我不知道为什么微软没有让事情变得更容易处理(例如在java中导入jar文件),这非常令人困惑,同样的事情发生在我之前的wiaaut.dll上我必须在系统与regsvr ..
最近,我遇到了InternalsVisibleTo方法,使内部类和方法对其他程序集可见.虽然这在你有大量程序集的应用程序中非常有用,并且你想避免循环依赖或代码重复,但我们中的一些人认为这可能会暴露一个安全漏洞.你的想法是什么?
例如,如果我有一个属性:
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("foo")]
即使将其隐藏在assemblyInfo.cs文件中,也可以通过反汇编等方式发现这一点.并非每个人都会对其组件进行签名或混淆.现在,有了可能有更多功能的信息,我可以创建自己的程序集foo.dll,然后使用我以前无法使用的方法/类.
在64位linux上学习GAS汇编.许多教程都是针对32位汇编的.
很难通过x86_64程序集进行丛林攻击.
当我用gcc编译ac程序时,我仍然看到一些%eax和movl.
我主要玩int32_t.
但我认为必须使用64位指令x86_64(如rax,rbx等等).
我不太了解.他们不应该%rax和movq?在我的装配程序中,我应该使用movq,对吧?即使是32位整数?我是一个迷失的初学者.
谢谢
(处理器Intel x86)
.MODEL SMALL
Print EQU 2
Exit EQU 4Ch
.DATA ;------------------------------------------------------
a DW 8
b DW 2
.CODE ;------------------------------------------------------
Start PROC
mov ax, SEG DGROUP
mov ds, ax
mov ax, a
;div b <---- uncommenting it makes program hang
mov dx, ax
add dx, '0'
mov ah, Print
int 21h
mov ah, Exit
int 21h
; -----------------------------------------------------------
Start ENDP
.STACK 512
END Start
Run Code Online (Sandbox Code Playgroud)
如果使用Turbo Assembler进行编译,则代码将输出8。如果取消注释DIV命令,则代码将挂起。
使用Turbo Debugger查看寄存器时,我看到DIV命令将除法结果发送到AX寄存器中-相同的寄存器存储了8,并将被发送到DX进行打印。
DIV挂起程序的原因是什么?我是否监督过DIV将数据放入寄存器的工作,这些数据将由某些重要的后台功能使用?
我知道在函数调用期间,EBP寄存器指向被调用函数推送到堆栈的第一个值.但是当第一次调用main函数时,EBP寄存器指向什么?它是第一个被main函数压入堆栈的局部变量吗?
所以我有.
pushl %ebp
movl %esp, %ebp
movswl 12(%ebp), %edx
movl 8(%ebp), %eax
subl %edx, %eax
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
如果说我的函数调用2个变量:function(int a, short b).
当我打电话给减法时,它会是(b - a)或者(a - b).如果我是正确的话,eax就是值存储的地方,所以我想说它会是(a - b).
假设我在 AX 中存储了以下值:1000100001001,在 CL 中我的值为 1。
当我执行 ROL AX, CL 指令时,我的 SW 告诉我 AX 的内容现在是 10001000010010。
然而,正确答案不应该是 00010000100101 吗?(我将所有位都向左滚动,因此 MSB 在右侧作为 LSB 出现?)
我知道这shrb代表逻辑右移。通常它与两个参数一起使用,shrb amount, %register. 但是,在我查看的代码中,它没有使用移位量 - 只指定了一个寄存器:
shrb %dil
Run Code Online (Sandbox Code Playgroud)
其中%dil代表 的最低有效字节%rdi。
现在上面的命令是否意味着我们右移 1?你会怎么去发现这个?有没有办法以某种方式执行命令,看看会发生什么?该文档对于提供有关省略班次金额时会发生什么的信息没有帮助:https : //docs.oracle.com/cd/E19253-01/817-5477/817-5477.pdf
我的CS课程中有一个以缓冲区溢出攻击为中心的项目.
我很难完全理解这个话题.
说我有以下功能:
08048cc5 <getbuf>:
8048cc5: 55 push %ebp
8048cc6: 89 e5 mov %esp,%ebp
8048cc8: 83 ec 38 sub $0x38,%esp
8048ccb: 8d 45 d8 lea -0x28(%ebp),%eax
8048cce: 89 04 24 mov %eax,(%esp)
8048cd1: e8 32 01 00 00 call 8048e08 <Gets>
8048cd6: b8 01 00 00 00 mov $0x1,%eax
8048cdb: c9 leave
8048cdc: c3 ret
Run Code Online (Sandbox Code Playgroud)
目前它返回此功能:
08048c53 <test>:
8048c53: 55 push %ebp
8048c54: 89 e5 mov %esp,%ebp
8048c56: 83 ec 28 sub $0x28,%esp
8048c59: e8 63 04 00 00 call …Run Code Online (Sandbox Code Playgroud)