这是我的代码,它工作正常:
section .bss
bufflen equ 1024
buff: resb bufflen
whatread: resb 4
section .data
section .text
global main
main:
nop
read:
mov eax,3 ; Specify sys_read
mov ebx,0 ; Specify standard input
mov ecx,buff ; Where to read to...
mov edx,bufflen ; How long to read
int 80h ; Tell linux to do its magic
; Eax currently has the return value from linux system call..
add eax, 30h ; Convert number to ASCII digit
mov [whatread],eax ; Store how many bytes has been read to memory at loc **whatread**
mov eax,4 ; Specify sys_write
mov ebx,1 ; Specify standart output
mov ecx,whatread ; Get the address of whatread to ecx
mov edx,4 ; number of bytes to be written
int 80h ; Tell linux to do its work
mov eax, 1;
mov ebx, 0;
int 80h
这是一个简单的运行和输出:
koray@koray-VirtualBox:~/asm/buffasm$ nasm -f elf -g -F dwarf buff.asm
koray@koray-VirtualBox:~/asm/buffasm$ gcc -o buff buff.o
koray@koray-VirtualBox:~/asm/buffasm$ ./buff
p
2koray@koray-VirtualBox:~/asm/buffasm$ ./buff
ppp
4koray@koray-VirtualBox:~/asm/buffasm$
我的问题是:这两条指令是什么:
mov [whatread],eax ; Store how many byte reads info to memory at loc whatread
mov ecx,whatread ; Get the address of whatread in ecx
为什么第一个适用于[]但另一个没有?
当我尝试用以下代码替换上面的第二行时:
mov ecx,[whatread] ; Get the address of whatread in ecx
可执行文件无法正常运行,它不会在控制台中显示任何内容。
答案 0 :(得分:4)
使用括号而不使用括号基本上是两回事:
括号表示给定地址的内存中的值是指。
没有括号的表达式意味着地址(或值)本身就是指。
示例:
mov ecx, 1234
表示:将值1234写入寄存器ecx
mov ecx, [1234]
意思是:将存储在地址1234的存储器中的值写入寄存器ecx
mov [1234], ecx
表示:将存储在ecx中的值写入地址为1234的存储器
mov 1234, ecx
...没有意义(在此语法中)因为1234是一个无法更改的常数。
Linux“写”syscall(INT 80h,EAX = 4)需要写入值的地址,而不是值本身!
这就是为什么你不在这个位置使用括号!