【发布时间】:2014-07-31 16:44:12
【问题描述】:
我是这个论坛的新手。 我对高级语言有一点经验(真的很少)。大约一个月前,我认为在 linux 上选择 nasm (IA-32) 后,看看汇编是如何工作的会是个好主意。
现在,结束它之后,我尝试编写一个简单的程序,让计算机打印一个包含 100 个数字(1 2 4 8 16...)的列表,但我什至无法正确完成。 我得到这个输出:
1PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP(continues)...
程序是这样的:
section .text
global main
main:
mov word [num], '1'
mov ecx, 100
doubl:
push ecx ; to push the loop counter
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 1
int 0x80
sub ecx, 30h
add ecx, ecx ; shl ecx, 1
add ecx, 30h
mov [num], ecx ; deleting this line I get 11111111111111111...
pop ecx ; to pop the loop counter
loop doubl
exit:
mov eax, 1
int 0x80
section .bss
num resw 2
看起来错误出在将数字翻倍的部分或将其存储在变量“num”中的部分,但我不明白为什么会发生以及如何解决它。
顺便说一句,有人可以解释一下何时准确地使用方括号吗?有什么规定吗?本教程将其称为“有效地址”,看起来当我想移动(或做某事)变量的内容而不是对变量的地址进行操作时,我必须使用方括号。然而我对此很困惑。我看到它用于:
mov ebx, count
inc word [ebx]
mov esi, value
dec byte [esi]
但是想要增加寄存器的内容不是很明显吗(因为它没有地址(或者没有地址?)??
【问题讨论】:
-
sys_write调用需要一个指向您要在ecx中输出的字节的指针,并且您正试图将实际值保留在那里。此外,您的 add/sub 30h 技术仅适用于小于 10 的值。 -
相关:一个 x86-64 Linux(使用 64 位
syscall而不是 32 位int 0x80)实现转换和打印,很像迈克尔在这里的回答:stackoverflow.com/questions/13166064/…跨度>