以下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中有效。