2013-12-17 54 views
1

我正在创建自己的玩具编程语言(称为SP4RX),后面是Jack Crenshaw的令人惊叹的编译器教程(已翻译成C++)。我在64位Ubuntu系统上构建,因此正在学习编译器的汇编。我想提出另外一个程序作为开始:但我得到一个分段错误和核心转储:(Linux x64程序集

section .text 
global _start 

_start: 
mov rax, 0 
add rax, [num1B] 
add rax, [num2B] 
mov [result], rax 
mov rdx, [result] 
mov rcx, 8 
mov rax, 4 
mov rbx, 1 
int 80h 

mov rbx, 1 
mov rax, 0 
int 80h 


section .data 

    num1B: db 0Ah 
num2B: db 0Ah 
result: db 0 

section .bss 

任何建议,我在做什么错

回答

3

此程序不会添加两个字节,而是两个四字,因为您正在使用64位寄存器进行加载/存储。其中之一是从错位地址读取,因此,段错误。

num1B,num2Bresult应该定义为dq而不是db

section .data 

num1B: dq 0Ah 
num2B: dq 0Ah 
result: dq 00h 

如果你仍然想添加两个字节,结果存储在另一个字节,使用8位寄存器,或者使用movzx/movsx指令零/符号字节的内容扩展到完整的64位寄存器。

_start: ;8-bit register version 
mov al, 0 
add al, [num1B] 
add al, [num2B] 
mov [result], al 
movzx rdx,byte ptr [result] 

_start: ;MOVZX version 
movzx rax,byte [num1B] 
movzx rbx,byte ptr [num2B] 
add rax,rbx 
mov [result],al 
movzx rdx,[result] 
+0

这就是它,谢谢! –

2

根据Intel guidelines进行数据比对?在64位英特尔架构,

在16位Intel体系结构,数据对齐对性能的影响很小,它的使用是完全可选的。在IA-32中,正确地对准数据可以是一个重要的优化,虽然它的使用仍然是可选的,只有少数例外tions,其中正确的对齐是强制性的。然而,64位环境对数据项目提出了更严格的要求。未对齐的对象导致程序异常。

我不能肯定,如果这个问题在这里也适用,但在我看来像num1B, num2B,result分配单字节,而mov的代码中使用的64位寄存器会努力做到的取多个未对齐的字节。如果问题不对齐,则可能是.data部分末尾的读数。