- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
section .data:
msg: db "Hello !"
msglen: equ $-msg
section .text:
global _start:
_start:
mov ebx,msg
mov ecx,msglen
mov eax,4
int 80h
mov eax,1
int 80h
上面的代码不起作用。但下面的代码运行良好。
section .data:
msg: db "Hello !"
msglen: equ $-msg
section .text:
global _start:
_start:
mov ecx,msg
mov edx,msglen
mov eax,4
int 80h
mov eax,1
int 80h
我所做的就是将 ebx 更改为 ecx,将 ecx 更改为 edx。这里发生了什么?
最佳答案
您的第二个代码之所以有效,是因为 write(0, "string", len)
恰好有效。 FD 0 是标准输入,但在终端中,程序通常与所有 3 个标准 FD 一起运行,引用在 TTY 上以读/写方式打开的相同文件描述。
因此您可以写入标准输入,除非您将其重定向到文件。
在您的 _start
入口点进入用户空间之前,内核会将所有寄存器清零,因此如果您不设置它,则 EBX = 0。 write(2)
将文件描述符作为其第一个参数。
使用strace ./a.out
查看您的系统调用。
您的第一个代码不起作用,因为 write("string", len, 0)
将指针作为文件描述符编号传递,因此 sys_write
将返回 -EBADF
(如果它首先检查 len
是否是有效指针,则返回 -EFAULT
)。唯一有效的 fd 将为 0、1 或 2,除非您使用 ./a.out 12345>&1
之类的重定向来打开 fd 12345
作为 1
的副本。再次使用strace
。
并阅读有关系统调用调用约定的文档。 What are the calling conventions for UNIX & Linux system calls on i386 and x86-64有链接。
另请参阅https://stackoverflow.com/tags/x86/info更多文档/手册和指南的链接。
关于linux - ebx 寄存器在 NASM 中不起作用,但 ecx 可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374330/
GCC 给我做了一些汇编代码,里面有这个语句: lea eax, [ebx+eax] (英特尔语法) 只是好奇,这有什么区别,和: add eax, ebx 是? eax 和 ebx 包含函数的返回值
我正在学习逆向工程的基础。在逆向破解版时,我碰巧在几乎每个函数的开头都看到了这种模式: pushl %ebp movl %esp, %ebp
我正在尝试学习一些汇编,但我很难理解一些基本的东西是做什么的。 eax ebx ecx 只是变量还是除了存储值之外它们都有独特的特定用途? 最佳答案 eax, ebx, ecx 等等其实都是寄存器 ,
我正在研究计算机系统,程序员的观点(第 3 版),练习题 3.3 包含以下行: movb $0xF, (%ebx) 我应该找出这行 x86-64 汇编代码有什么问题,答案是:“不能使用 %ebx 作为
我这个汇编代码: INT %ebx GCC 在尝试组装它时给我一个错误: INT ERROR:mismatch operand type for 'int'. 这是否意味着指令 INT 的操作数必须是
80386-80686+:不建议软件程序员使用EBX寄存器,因为它是CPU的特定寄存器,或者因为O.S.而不能使用它。 (至于Windows)由于某些原因需要它......? 但是如果我在使用它之前将
我已经用汇编编写了一个程序,输入后: as -32 maximum.s -o maximum.o ld -m elf_i386 maximum.o -o maximum ./maximum 它显示段错
我用 C++ 编写了一个“危险的”程序,它在一个堆栈帧和另一个堆栈帧之间来回跳转。目标是从调用堆栈的最低层跳转到调用者,做一些事情,然后再次向下跳,每次都跳过中间的所有调用。 我通过手动更改堆栈基地址
我试图理解一些汇编代码: movl $244, %eax movl %1, %%ebx 第一个表示将数字244放入寄存器eax,但是第二个是什么意思?在此先感谢您的帮助 P.S see the dif
我正在研究 x86 汇编代码高尔夫拼图。我正在使用 NASM 组装源文件: nasm -f elf32 -O0 main.s ld -m elf_i386 -s -O0 -o main main.o
我有以下用 MASM 为 i386 处理器编写的简单程序: TITLE BLA .MODEL SMALL .386 .STACK
在Linux环境下,如果我写一些NASM代码如下: mov eax, 1 ; system call 1 - sys_exit mov ebx, 0 int 0x80 ... ebx 中的值是多少?
在汇编中创建函数时,我在使用如此少量的寄存器进行操作时遇到问题 - 这些寄存器中的什么内容阻止了我使用它们?我可以在编码时将其内容复制到参数中,并在退出函数之前重置它,以免破坏其目的吗? 最佳答案 W
这个问题已经有答案了: What is the meaning of MOV (%r11,%r12,1), %edx? (2 个回答) 已关闭 5 年前。 一直在从事 assembly 作业,并且在很
我知道还有其他一些类似的问题,但我仍然无法理解它的 () 部分。有人可以为我拼出这个语法吗?谢谢。 最佳答案 cmp %eax,0x80498d4(,%ebx,4) cmp 是比较汇编指令。它通过从左
我正在尝试创建 read() 包装器但收到此错误: error: unknown register name ‘%%ebx’ in ‘asm’ in line 23 //(the bold line)
我正在尝试实现“Win32 EXE 的动态 fork ”的已知方法,它被称为 RunPE。我的问题是我无法获得在 http://www.security.org.sg/code/loadexe.htm
谷歌不显示结果, 有谁知道? 最佳答案 X 表示 对 ,并且至少可以追溯到 8080。它有 8 位寄存器 B、C、D、E、H、L(等等),它们也可以成对使用(BC、DE 和 HL)。 BC 和 DE
我正在尝试使用 AT&T/GAS 语法将此 for 循环从 C 语言转换为汇编语言: for(int j = i; i*j < N; j++) { A[i*j] = 0; } 我将i存储在%e
section .text global _start ;must be declared for linker (ld)
我是一名优秀的程序员,十分优秀!