【问题标题】:Assembler memory access error汇编程序内存访问错误
【发布时间】:2014-05-22 14:57:45
【问题描述】:

我在使用 64 位汇编程序时遇到问题,我只是想使用 div -> 7/2,但出现内存访问错误,不知道为什么

 section .text

        global _start:
_start:
    xor     rdx,    rdx
    mov     rax,    7
    mov     rbx,    2
    div     rbx,
    mov     rax,    rdx
    ret

我使用的是 64 位寄存器,所以寄存器没有问题,所以一切正常,但我得到一个错误,不知道为什么

编辑

我知道这不是汇编程序的问题,但我做错了但不确定是什么

我正在使用 nasm

更新代码

  section .text

    global _start:
_start:
    xor     rdx,    rdx
    mov     rax,    7
    mov     rbx,    2
    div     rbx,
    int 80h
    mov     rax,    1

现在它什么也不做,没有任何错误

【问题讨论】:

  • 请告诉我们你调用这个函数的代码。
  • 问题是最后的ret——如果你在linux上运行这个没有libc,你不能使用ret来结束进程,你必须使用exit syscall。跨度>
  • @Ruud 我不明白你的意思,但我有一个名为 divtest.asm 的文件,在终端中我输入 nasm -f elf64 divtest.asm 然后 ld -s -o modtest modtest。 o 这样然后 ./modtest 在此命令之间只有在最后一个命令之后才没有错误我得到内存访问错误而没有任何问题所在的行
  • @Jester 我添加了 int 80 而不是 ret 但我仍然得到同样的错误
  • @Jester 我更新了我的代码

标签: assembly 64-bit nasm x86-64


【解决方案1】:

如果您使用GCC 作为链接器,则可以使用ret。您必须将条目标签命名为 main。不要忘记使用退出代码填充EAX

test.asm:

extern: printf

section .data
    fmt: db `result: %lu  remainder: %lu\n`

section .text

    global main:
main:
    xor     rdx,    rdx
    mov     rax,    7
    mov     rbx,    2
    div     rbx

    mov rdi, fmt
    mov rsi, rax
    ; mov rdx, rdx
    xor eax, eax
    call printf

    mov eax, 0
    ret

构建并运行:

nasm -felf64 test.asm
gcc -otest -m64 test.o
./test

如果您使用LD 作为链接器,您必须自己管理退出。将ret 块替换为:

mov ebx,0           ; exit code, 0=normal
mov eax,1           ; exit command
int 0x80            ; interrupt 80 hex, call kernel

或(推荐用于 x86-64):

mov   rax, 60       ; sys_exit
mov   rdi, 0        ; return 0 (success)
syscall             ; syscall

构建并运行:

nasm -felf64 test.asm
ld -e main -m elf_x86_64 -I/lib64/ld-linux-x86-64.so.2 -lc -o test test.o
./test

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多