我正试图从ASM中调用一个函数.我知道如何调用它,但我很难找到如何获得此函数的返回值.一个例子如下:
C代码:
int dummy() {
return 5;
}
Run Code Online (Sandbox Code Playgroud)
(N)ASM代码:
dummyFunction:
call dummy
;grab return into eax
inc eax ; eax should be 6 now
ret
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在尝试使用64位Mac OS X Lion运行基本的汇编文件,使用默认安装Xcode的nasm和ld.
我编写了一个汇编文件,它打印了一个字符,然后我使用nasm构建它.
nasm -f elf -o program.o main.asm
但是,当我将它与ld链接时,它会因为相当多的错误/警告而失败:
ld -o program program.o
ld: warning: -arch not specified
ld: warning: -macosx_version_min not specificed, assuming 10.7
ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64)
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib
ld: entry point (start) undefined. Usually in crt1.o for inferred architecture x86_64
Run Code Online (Sandbox Code Playgroud)
所以,我试图纠正其中的一些问题,并没有取得任何进展.
这是我尝试过的一件事:
ld -arch i386 -e _start -o program program.o
我认为这会奏效,但我错了. …
进位标志可以包含哪些值?它只是0x00和0x01(布尔值)还是像其他CPU寄存器一样是16(或32/64)位?
我如何检查其状态?难道我只是用它喜欢像一个正常的CPU寄存器cmp cf, 0x00然后jg <jump destination>?
我正在写一个迷你操作系统.将它用于我自己的目的是好的做法,还是应该为CPU的独占写权限保留,我所做的一切都是从它读取的?
我正在使用Assembler编写一个'Hello world'程序.我已经\n在每个字符串的末尾声明了2个字符串常量和新行字符:
section .data
str1: db "abcd\n"
str2: db "efgh\n"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, str1
mov rdx, 6
syscall
mov rax, 1
mov rdi, 1
mov rsi, str2
mov rdx, 6
syscall
mov rax, 60
mov rdi, 0
syscall
Run Code Online (Sandbox Code Playgroud)
在构建并执行此代码之后,我得到了以下结果:
$ nasm -f elf64 -o first.o first.asm
$ ld -o first first.o
$ ./first
abcd\nefgh\n$
Run Code Online (Sandbox Code Playgroud)
为什么\n打印出新行字符?
我是汇编的初学者(使用nasm).我正在通过大学课程学习集会.
我试图了解sys_read linux系统调用时的行为.具体来说,sys_read在读取新行或换行符时停止.根据我所教的,这是事实.这篇在线教程文章也肯定了事实/主张.
当sys_read检测到换行时,控制返回到程序,用户输入位于您在ECX中传递的内存地址.
我检查了linux程序员的sys_read调用手册(通过"man 2 read").它没有提到它应该的行为,对吧?
read()尝试从buf开始读取从文件描述符fd到缓冲区的字节数.
在支持搜索的文件上,读取操作从文件偏移开始,文件偏移量增加读取的字节数.如果文件偏移量等于或超过文件末尾,则不读取任何字节,read()返回零.
如果count为零,则read()可以检测下面描述的错误.在没有任何错误的情况下,或者read()没有检查错误时,计数为0的read()返回零并且没有其他影响.
如果count大于SSIZE_MAX,则结果未指定.
所以我的问题是,为什么会发生这种行为?Linux内核中的规范是否应该发生这种情况还是其他内容的结果?
我试图在nasm中创建一个应该显示该字母的简单程序a.然而,它给了我一个Segfault并说:
./a.out: Symbol `printf' causes overflow in R_X86_64_PC32 relocation
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
基本上,我试图将值0x61(字母a的十六进制)移动到内存地址1234,然后将其作为参数传递给printf.这是我的确切代码:
extern printf
section .text
global main
main:
push rbp
mov rax,0
mov qword [1234], 0x61 ; move 0x61 into address 1234
mov rdi, qword [1234] ; mov address 1234 into rdi
call printf ; should print the letter a
pop rbp
mov rax,0
ret
Run Code Online (Sandbox Code Playgroud)
我正在运行Linux x86_64
这两个工具都将汇编指令直接转换为机器代码,但是有可能确定哪一个生成最快,最干净的代码?
我已经坚持了好几个星期了,并且不知道我哪里出错了,因为NASM没有给我任何错误.由于评论,代码非常自我解释.
这是从BIOS加载的代码
;--------------------------------------------
; 'boot.asm'
; loaded from BIOS
[org 0x7C00]
[bits 16]
;--------------------------------------------
main:
mov ah, 0x0E ; print function
mov al, '.' ; ascii char
int 0x10 ; IO int
resetdisk:
mov ah, 0x00 ; reset function
mov dl, 0x00 ; drive
int 0x13 ; disk int
jc resetdisk
readdisk:
mov bx, 0x8000 ; segment
mov es, bx
mov bx, 0x0000 ; offset
mov ah, 0x02 ; read function
mov al, 0x03 ; sectors
mov ch, 0x00 ; …Run Code Online (Sandbox Code Playgroud) 我正在学习装配,能够进行逆向工程的动力.我正在尝试找到我应该开始的汇编程序,以便我可以找到教程并开始编写一些程序集.
我开始知道MASM有很多内置结构,因此我将主要使用它们而不是编码它们,如果我选择NASM,我将不得不这样做.
我的问题是......是真的吗?如果是的话,你建议从逆向工程师的角度学习装配的汇编程序和一些好的教程.
另外,如果您有关于倒车的其他建议?替代方法还是什么?
PS:我在这里看过很多文章和问题,但我仍然感到困惑.
看看这个汇编代码.它专为32位x86设计,将由nasm编译
...
my_function:
pop %eax
...
ret
main:
push 0x08
call my_function
Run Code Online (Sandbox Code Playgroud)
我很久以前就已经知道我们可以使用堆栈在主程序和函数之间传递参数.我希望eax包含0x08,但这是假的,我无法解释原因.我该怎么做才能获取我的函数参数?