我是汇编程序devise新手,无法将字符打印到屏幕上。 每当我执行我的程序,我得到一个分段错误,我不知道为什么。 .section .data A: .long 65 # ascii code for 'A' .section .text .globl _start _start: movl $1, %edx # length of character to print, 1 movl A, %ecx # what I want printed movl $1, %ebx # file descriptor for STDOUT movl $4, %eax # syscall number for sys_write int $0x80 # calls […]
如果Linux softirq正在通过中断Linux内核模式运行,并且中断的任务正在使用FPU,则不允许在softirq中使用FPU。 如果被中断的任务是用户模式进程,则仍允许在softirq中使用FPU,但不能中断内核模式。 下面讨论代码。 问题是,为什么如此? static inline bool interrupted_kernel_fpu_idle(void) { return !__thread_has_fpu(current) && (read_cr0() & X86_CR0_TS); }
仅使用(32位)x86程序集,是否可以检查地址是否可写, 是否与操作系统没有交互,以及是否存在段错误风险? 程序将在第3环的Linux系统上运行。我不能使用“verw”指令。 举个例子,我可能想要检查地址0x0804a000是否可写。 但是,如果我例如做“mov eax,0x0804a000; mov [eax],eax”,那么,如果地址不可写,程序将会出现段错误。 我知道的唯一的方法是例如调用sys_read到地址,看看是否失败,但是这与操作系统交互。 有没有办法来检查一个地址是否可写入给定的约束? 如果是这样,怎么样?
public static void main(String[] args) { int a = 0; for (int i = 0; i < 20; i++) { if (i < 10) { a++; } else { a–; } } System.out.println(a); System.exit(0); } 这是我要翻译成汇编代码的代码。 我认为我做了一切除了system.out.println(a); 我已经尝试几乎所有的东西,各种input到sys_write调用。 我不允许使用print f,而应该使用mov命令。 这是我现在的代码: cr equ 13 ld equ 10 STDOUT equ 1 SYS_WRITE equ 4 section .bss […]
我在我的Mac上运行汇编代码有问题。 我目前正在通过Jeff Duntemann的书Step by Step。 问题是它专注于为32位Linux系统编写程序集。 我正在使用一个64位的Mac OS X系统。 我仍然可以在使用nasm -f macho32的64位系统上运行32位程序集,但显然Duntemann书中的代码不起作用,因为在Linux和Mac OS x中的系统调用是不同的。 我将如何转换这个程序: ; Executable name : EATSYSCALL ; Version : 1.0 ; Created date : 1/7/2009 ; Last update : 2/18/2009 ; Author : Jeff Duntemann ; Description : A simple program in assembly for Linux, using NASM 2.05, ; demonstrating the […]
实际上,我试图理解英特尔x64语法中的NASM汇编的基本概念,但在尝试创build相当于strchr的同时面临一个问题。 我一直在航行networking获取最大的信息,但我不明白如何比较当前string(如str [我])与一个简单的字符。 这里是testing主要: #include <stdio.h> extern char* my_strchr(char*, char); int main(void) { char* str; str = my_strchr("foobar", 'b'); printf("%s\n", str); return 0; } 这里是我的汇编代码: 我假设rdi是我的string,rsi是我的单字节数据。 my_strchr: push rcx ;Save our counter xor rcx, rcx ;Set it to 0 loop: cmp rdi, byte 0 ;Check the end of string jz end cmp rsi, [byte rdi+rcx] […]
我试图用C语言编写一个使用Assembly的函数的程序。 下面你可以看到代码: sum_c.c #include <stdio.h> extern int _assemblySum(int x, int y); int main(int argc, char *argv[]){ int total; total = _assemblySum(4, 2); printf("%d\n", total); return 0; } assembly_Sum.asm SECTION .DATA SECTION .TEXT GLOBAL _assemblySum _assemblySum: push rbp mov rbp, rsp mov rax, [rbp+16] mov rbx, [rbp+24] add rax, rbx pop rbp ret COMPILE nasm -f […]
我有一个汇编代码(hello1.s),其中定义了全局标签A_Td ,我想访问C程序中/从全局标签A_Td定义的所有长数据值。 .file "hello1.s" .globl A_Td .text .align 64 A_Td: .long 1353184337,1353184337 .long 1399144830,1399144830 .long 3282310938,3282310938 .long 2522752826,2522752826 .long 3412831035,3412831035 .long 4047871263,4047871263 .long 2874735276,2874735276 .long 2466505547,2466505547 由于A_Td在文本部分中定义,所以它被放置在代码段中,只有一个副本被加载到内存中。 使用yasm,我生成了hello1.o文件 yasm -p gas -f elf32 hello1.s 现在,要使用全局标签A_Td来访问所有的长数据,我已经写了下面的C代码(test_glob.c)来从这里得到全局标签的线索。 //test_glob.c extern A_Td ; int main() { long *p; int i; p=(long *)(&A_Td); for(i=0;i<16;i++) { printf("p+%d %p %ld\n",i, p+i,*(p+i)); } […]
好的,我得到这个编译错误: 错误:“push”后缀或操作数无效 当我使用这一行时: pushw %es; 我知道这是%es或w,因为我已经成功地将其他push,pop命令移植到64位汇编器。 根据我发现的一些文档, %es是一个现有的registry,我认为它没有被引用。 那么可能是我的问题呢? 我对我的生物非常生锈,我认为它可能是w。 谢谢你的帮助。
我需要用Linux编译器编写一个简单的4位函数计算器来编码2个数字,但是程序不能完全正常工作,因为有时读取2个数字会失败。 我的设置和数据: bits 32 global main extern scanf extern printf extern exit section .data menu: db ; truncated, but essentially a string msg1: db "El resultado de la suma es: %d", 10, 0 msg2: db "El resultado de la resta es: %d", 10, 0 msg3: db "El resultado de la multiplicacion es: %d", 10, 0 […]