Articles of nasm

linux nasm代码什么都不显示

我正在制作一个用户input号码的程序,它打印出从零到号码的所有号码。 它编译好,链接正常,运行时不返回任何错误,但它没有打印任何东西。 这里是代码: SECTION .data len EQU 32 SECTION .bss other resd len data resd len SECTION .text GLOBAL _start _start: nop input: ; This section gets the integer from the user mov eax, 3 ; } mov ebx, 1 ; } mov ecx, data ; } System_read call mov edx, len ; } int […]

Syscalls for x86-64 Linux NASM(YASM)的详细说明

我find了x86-64模式(带参数)的系统调用列表: http : //filippo.io/linux-syscall-table/但是我在哪里可以得到这个系统调用的详细描述? 例如下面的例子中,除了0102o(rw,create)之外,哪些标志可以用于'open'系统调用,在其他情况下:只读,只写等。 SECTION .data message: db 'Hello, world!',0x0a length: equ $-message fname db "result" fd dq 0 SECTION .text global _start _start: mov rax, 2 ; 'open' syscall mov rdi, fname ; file name mov rsi, 0102o ; read and write mode, create if not mov rdx, 0666o ; permissions set syscall […]

VT-100命令工作奇怪

我正在用NASM写简单的时钟程序。 我在OSX上通过iTerm使用Ubuntu 14.10 Vagrant框。 terminal是xterm,所以应该是VT-100兼容。 我需要删除一行。 例如,我期望以下行为: Hello, this is clock program 13:01:25 UTC+4 下一刻: Hello, this is clock program 13:01:26 UTC+4 我写了下面的函数。 打印: func_print: mov eax, sys_write mov ebx, stdout int 0x80 ret 为了清楚: clr db 0x1b, "[K" clr_len equ $-clr … func_clear: mov ecx, clr mov edx, clr_len call func_print 为了保存和恢复职位,我使用VT-100及其命令: [7分别为[7和[8 : […]

如何将javas“out.println”翻译为程序集? 不使用printf

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 […]

NASM scanf未定义参考(LINUX)

我是新assembly。 我有代码的问题。 我正在尝试使用scanf创build简单的程序。 这是代码: global main extern printf extern scanf section .text section .data message: db "The result is = %d", 10, 0 request: db "Enter the number: ", 0 integer1: times 4 db 0 ; 32-bits integer = 4 bytes formatin: db "%d", 0 main: ; Ask for an integer push request call printf […]

nasm系统调用Linux

我有一个关于在组装Linux x86系统调用的问题。 当我在linux上用nasm创build一个新的汇编程序时,我想知道为了完成特定任务(例如读取文件,写入输出或简单退出…)必须使用哪些系统调用。 我知道一些系统调用,因为我已经读过一些互联网上的例子(如eax = 0,ebx = 1 int 0x80退出,返回值为1),但没有更多…我怎么知道是否有其他退出系统调用的参数? 还是换另一个系统调用? 我正在寻找一个文档,解释哪些系统调用哪些parameter passing在哪些寄存器。 我已经阅读了有关退出函数等的手册页,但没有向我解释我在问什么。 希望我很清楚, 谢谢!

如何比较string中的字符与NASM x86_64 Linux程序集中的另一个字符

实际上,我试图理解英特尔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] […]

尝试将地址复制到结构中时出现分段错误?

我有一个NASM程序崩溃与分段错误。 在文件的开头,定义了以下结构体: struc mystruct .myhandler resq 1 endstruc .bss部分中创build了一个结构的实例: section .bss inst resb mystruct 程序所做的第一件事就是试图在结构的唯一字段中存储标签的地址: section .text global _start _start: lea rax, [handler] mov [inst + mystruct.myhandler], rax handler: ; … 根据GDB, lea和mov指令如下: (gdb) disassemble _start Dump of assembler code for function _start: => 0x0000000000400080 <+0>: lea rax,ds:0x400090 0x0000000000400088 <+8>: mov QWORD PTR ds:0x601000,rax … […]

在Linux下的16位链接

当我使用命令“nasm -f elf -l hello.lst hello.asm”时,我正在使用NASM汇编程序,但是当与gcc“gcc -o hello hello.o”链接时,它会生成一个错误: hello.asm 🙁 .text + 0x4):重定位被截断为适合:R_386_16对`.data'collect2:ld返回1退出状态 我了解到,这是gcc和16位的一些问题 任何解决scheme

在使用linux程序集打印variables到命令行

试着在Linux程序集中,我遇到了以下问题。 我刚刚开始,所以我的程序是一个相对简单的程序,从我在linuxassembly上find的一些例子中派生出来。 它将第一个parameter passing给命令行并将其打印出来。 这是我到目前为止… section .bss test_string: resb 3 section .text global _start _start: pop ebx ;argument number pop ebx ;program name pop ebx ;first argument mov [test_string],ebx mov eax,4 mov ebx,1 mov ecx,test_string mov edx,3 int 80h mov eax,1 mov ebx,0 int 80h 我知道这是写得不好,但因为我是新来的,我只是想更好地了解如何汇编指令/variables工作之前,我继续前进。 我汇编和链接使用… nasm -f elf first.asm ld -m elf_i386 -s […]