Articles of nasm

NASM一次打印一个字符

怎么这个程序不打印到屏幕上,我在INT 80命令中丢失了什么? section .bss section .data hello: db "Hello World",0xa ;10 is EOL section .text global _start _start: mov ecx, 0; ; int i = 0; loop: mov dl, byte [hello + ecx] ; while(data[i] != EOF) { cmp dl, 0xa ; je exit ; mov ebx, ecx ; store conetents of i (ecx) ; […]

汇编:一个简单的例子,将x86代码转换为x64

虽然我正在学习x64程序集,我试图使添加方法来添加两个整数,并使用程序集返回整数。 我有x86的工作代码,我试图转换为x64 只是我把寄存器的名字改为x64,并且生成的对象文件没有错误,但是当我在C函数中使用它时,我总是得到sum = 0。 我认为参数的位置有问题,我没有find这样的问题的好文件。 section .text global addi addi: push rbp mov rbp, rsp mov rax,[rbp+12] mov rdx,[rbp+8] add rax, rdx pop rbp ret

在32位模式下的NASM x86_64汇编:为什么此指令产生RIP相对寻址代码?

[bits 32] global _start section .data str_hello db "HelloWorld", 0xa str_hello_length db $-str_hello section .text _start: mov ebx, 1 ; stdout file descriptor mov ecx, str_hello ; pointer to string of characters that will be displayed mov edx, [str_hello_length] ; count outputs Relative addressing mov eax, 4 ; sys_write int 0x80 ; linux kernel system […]

操作大小没有指定

我在32位汇编中遇到了一个问题,在Linux上与NASM进行汇编。 这是我的插入sorting的实现 myInsertionSort: push ebp mov ebp, esp push ebx push esi push edi mov ecx, [ebp+12] ;put len in ecx, our loop variable mov eax, 1 ; size of one spot in array, one byte mov ebx, 0 mov esi, [ebp+8] ; the array loop loop_1 loop_1: cmp eax, ecx ; if we're done […]

使用r8寄存器作为循环计数器会导致无限循环 – 为什么?

下面的代码通过使用rsi寄存器作为循环计数器打印hello world 10次。 section .data hello: db 'Hello world!',10 helloLen: equ $-hello section .text global _start _start: mov rsi, 0 ;<— use r8 here do_loop: inc rsi ;<— use r8 here ;print hello world mov eax,4 mov ebx,1 mov ecx,hello mov edx,helloLen int 80h cmp rsi, 10 ;<— use r8 here jnz do_loop ;system exit […]

linux'不能执行二进制文件'我编译的每个可执行文件,chmod 777没有帮助

我跑红了linux 7.3(老,我知道),在过去的几个月中,我一直在学习汇编编程,编写小程序和编译与nasm。 几个月来,情况一直很好,现在由于一些未知的原因,我无法执行任何我编译的程序。 nasm file.s //used to work just fine, then I'd execute ./file 现在,当我运行./file时,首先我得到“权限被拒绝”,这从来没有发生过。 那么,一旦我chmod +777文件,我得到“不能执行二进制文件”。 我不知道为什么会发生这种情况,但这是令人非常沮丧的,因为我编译的任何东西都不会运行。 以root身份login不会改变任何内容。 所有的build议都欢迎,谢谢!

为什么nasm说我在g ++创build的程序集中有错误?

我有这个c + +代码: #include <iostream> using namespace std; int main () { char chr[] = "111111111111"; int pop = 9999; cout << chr << (pop+1) << endl; } 当我在shell(64位Linux)中执行g++ -S hello.cpp我得到汇编代码: 当我用它nasm hello.s它说它包含了很多的错误,如: instruction needed expression syntax error symbol `popq' redefined 也许这是因为它是64位? 我怎样才能编译我用g ++创build的.s?

在保持公平分配的同时从/ dev / urandom范围内获取字节

我想要在程序集(nasm,linux)中生成随机数字,而且我不想使用libc(出于教学原因),所以我打算读取/ dev / urandom。 事情是,我希望他们在一个特定的范围内。 比如说,我想要一个从0到99的数字。 当我从/ dev / urandom读取一个字节时,它将会在0x00到0xff(255)的范围内。 我能做的一件事是应用一个mod 100,这将保证正确的范围。 但是这种方法的问题是有些数字比其他数字有更多的机会出来。 51号将从3个不同的结果出来: 51 % 100 = 51 151 % 100 = 51 251 % 100 = 51 数字99只会来自两个不同的结果: 99 % 100 = 99 199 % 100 = 99 (there will be no 299 since the range of a byte ends in 255). 我提出的唯一解决scheme是在200-255范围内随机抽取数字,然后读取另一个数字。 […]

ROT13密码组装

所以我有我的ROT13密码做我想做的事情,但最后命令提示符显示在最后一行输出的同一行。 这是我在大会的第一个项目,所以我很不确定我做错了什么。

正确的用户input – x86 Linux程序集

所以我正在使用NASM在Linux上进行x86汇编程序。 这个程序基本上要求用户input他们的名字和喜欢的颜色。 这样做后,将这两个string存储在.bss节中声明的variables中,程序将打印出“无法用户名 , 最喜欢的颜色也是我最喜欢的颜色! 我遇到的问题是,在输出中有巨大的空间,因为我不知道用户input的string有多长,只有我声明缓冲区的长度。 section .data greet: db 'Hello!', 0Ah, 'What is your name?', 0Ah ;simple greeting greetL: equ $-greet ;greet length colorQ: db 'What is your favorite color?' ;color question colorL: equ $-colorQ ;colorQ length suprise1: db 'No way ' suprise1L equ $-suprise1 suprise3: db ' is my favorite color, too!', 0Ah […]