我正在用NASM编写汇编程序,并试图将2个内存值的值写入文件(特别是varDD和varDW的值)。
不幸的是,在尝试运行它时出现了分段错误。有人可以帮忙找出问题所在吗?
请注意,我无论如何都不是汇编专家,所以请原谅我的无知错误。
section .data
fileName db './output.txt', 0
varDD dd 1.01, 0x00
varDW dw 'abc', 0x00
varDDL equ $ - varDD
varDWL equ $ - varDW
section .text
global main
main:
mov EAX, 8
mov EBX, fileName
mov ECX, 0700
int 0x80
mov EBX, EAX
mov EAX, 4
mov ECX, [varDD]
mov EDX, [varDDL]
int 0x80
mov ECX, [varDW]
mov EDX, [varDWL]
int 0x80
mov EAX, 6
int 0x80
mov eax, 1
int 0x80
mov eax, 60
mov edi, 0
syscall
更新: 因此,我更正了以下代码:
section .data
fileName db './output.txt', 0
varDD dd 1.01, 0x00
varDW dw 'abc', 0x00
varDDL equ $ - varDD
varDWL equ $ - varDW
section .text
global main
main:
mov EAX, 8
mov EBX, fileName
mov ECX, 0700
int 0x80
mov EBX, EAX
mov EAX, 4
mov ECX, varDD
mov EDX, varDDL
int 0x80
mov EAX, 4
mov ECX, varDW
mov EDX, varDWL
int 0x80
mov EAX, 6
int 0x80
mov eax, 1
int 0x80
mov eax, 1
mov ebx, 0
int 0x80
这会运行并输出文件,但是在查看文件的十六进制转储时,其内容与所写变量的预期十六进制值不符。
十六进制转储: 0000000 47ae 3f81 0000 0000 6261 0063 0000 6261 0000010 0063 0000 0000014
更新2: 我更新如下:
section .data
fileName db './output.txt', 0
varDD dd 1.01, 0x00
varDDL equ $ - varDD
varDW dw 'abc', 0x00
varDWL equ $ - varDW
strace(相关部分)如下所示:
creat("./output.txt", 01274) = 3
write(3, "\256G\201?\0\0\0\0", 8) = 8
write(3, "abc\0\0\0", 6) = 6
close(3) = 0
我应该使用hexdump来验证值,但是hexdump仍然显示:
0000000 47ae 3f81 0000 0000 6261 0063 0000
000000e
这似乎与所写的值不符。 62 = b 61 = a和63 = c ..这些是乱序的,我看不到1.01的值。