请注意:我只是在努力学习。请不要因为我玩弄集会而对我大喊大叫。
我有以下方法:
uint32 test(int16 a, int16 b)
{
return ( a + b ) & 0xffff;
}
我根据我找到的的详细信息创建了一个.s文件。
我的.s文件包含以下内容:
.macro BEGIN_FUNCTION
.align 2 // Align the function code to a 4-byte (2^n) word boundary.
.arm // Use ARM instructions instead of Thumb.
我知道Java是一种安全的语言,但是当需要进行矩阵计算时,我可以尝试更快的方法吗?
我正在学习C++、数字Mars编译器和FASM中的__asm{}。我想在Java中做同样的事情。如何在函数中内联汇编代码?这有可能吗?
类似这样的东西(一个矢量化循环,使用AVX对CPU的支持,将数组的所有元素钳制为一个值,而不进行分支):
JavaAsmBlock(
# get pointers into registers somehow
# and tell Java which registers the asm clobbers somehow
vbroadcastss twe
试图使用以下代码获取中断描述符表的数据:
/* SIDT returns IDT in following format */
#pragma pack(1)
typedef struct
{
unsigned short IDTLimit;
unsigned short LowIDTBase;
unsigned short HighIDTBase
} s_idt_info;
#pragma pack()
.
.
.
s_idt_info idt_info; // returned by sidt
s_idt_entry *idt_e
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
i
如果我在方法中对指针进行操作,它就会工作。但当在另一种方法中用作参数时,相同的操作将失败。很明显我漏掉了什么。我猜是由于某种原因,foobar不能“看到”*ptr所指向的变量。
int main(int argc, char *argv[]){
unsigned short b =15;
unsigned short *ptr = &b;
//If I do it in main it works
unsigned short c = 10 & (*ptr);
//If I send it to foobar, it segfault
我正在编写一个程序,它将使用MASM调用一些C++函数。我在一个单独的文件中定义了两个整数之和并显示输出。
目前,我无法让“main.cpp”运行asmMain()来调用'main.cpp‘中的函数。
code.asm
; ---------------------------------------
promptFirst PROTO C
promptSecond PROTO C
printInt PROTO C
.586
.model flat, stdcall
.stack 4096
; --------------------------------------
我发了,但没有听到任何回应,我想也许这里的人知道。
我知道如何在程序集中编写函数,以便它们是C-可调用的;如果C可调用的名称是foo(),则程序集函数名为_foo()。
如果我想使用C++并优化程序集中的类方法,怎么办?我该怎么做?我认为唯一的主要问题是:
命名
访问“此”指针
通过某种方式了解偏移量来访问类成员
如果我不想担心最后两个问题,那么也许我会编写一个静态成员函数并这样做:
class MyClass
{
int x;
static int _doSomething(int u); // implement this in assembly
public
从本质上讲,我希望能够做这样的事情:
//assume myFunction is defined and takes one argument that is an int
char * functionName = "myFunction";
int arg = 5;
__asm{
push a
call functionName
}
基本上,我想调用一个名称存储在字符串中的函数。执行此操作的正确语法是什么?
编辑:我们谈论的是x86组装
我知道当格式化的I/O函数需要比所提供的参数更多的参数时,就会发生格式化字符串攻击。
在C中,
读取内存位置的一个示例:
printf("%x"); // this prints a memory address location in the stack
覆盖内存位置的另一个示例:
printf("Overwritten%n"); //this prints the number of chars in "Overwritten"
我的问题是:为什么这两种情况都会发生?为什么在格式化的字符串中只有%x而没有提供相应的值会在内存中打印一个地址?那