在32位Ubuntu中学习NASM程序集。我有点困惑:
在.bss
中,我为变量保留一个字节:
num resb 1
后来我决定给它一个值5
:
mov byte [num],5
在某些时候打印出来:
mov EAX,4
mov EBX,0
mov ECX,num
add ECX,'0' ; From decimal to ASCII
mov EDX,1
int 0x80
但它没有打印任何东西。
我猜这个问题是我给num
5
的值。我原本想这样做:
mov byte num,5
我认为num
指的是记忆中的位置,因此mov
会将5
复制到此位置。但我得到一个错误说
操作码和操作数的无效组合
基本上,为什么程序不打印5?而且,为什么我的建议无效?
答案 0 :(得分:1)
要使用int 0x80
和代码4
进行打印,您需要ECX
作为要打印的字节的地址。在您调用'0'
例程之前,您已将num
添加到ECX
中print
的地址,因此它是内存中其他内容的地址。
你可能想要这样的东西。我创建了一个单独的区域numout
来保存num
的ASCII版本:
numout resb 1
....
mov EAX,4
mov EBX,0
mov CL,[num]
add CL,'0'
mov [numout],CL
mov ECX,numout
mov EDX,1
int 0x80