一个简单的字符串操作导致Clang Assembler

时间:2017-12-30 14:37:31

标签: assembly clang x86-64

以下Clang Assembly程序:

.intel_syntax
 .global _main
_main:
 push rbp
 mov rbp,rsp
 lea rdi,[rip+helloWorld]
 call _printf
 mov al,'_'
 mov [rip+helloWorld+5],al
 lea rdi,[rip+helloWorld]
 call _printf
 mov rax,0
 pop rbp
 ret
helloWorld:
 .string "Hello world!\n"

输出:

Hello world!
Bus error: 10

Flat Assembler中几乎相同的程序:

format binary as 'COM'
org 100h

mov ah,9
lea dx,[hello]
int 21h

mov al,'_'
mov [hello+5],al

mov ah,9
lea dx,[hello]
int 21h

int 20h

hello:
db "Hello world!",10,13,24h

输出:

Hello world!
Hello_world!

前者导致总线错误的原因是什么?当您尝试访问不属于您的程序的内存地址时,应该会发生总线错误。但事实并非如此:" printf"功能显然能够访问字符串。只是看起来操作字符串的简单尝试会导致总线错误。它根本不是很明显,特别是因为几乎相同的程序在Flat Assembler中有效。

0 个答案:

没有答案