linux - 为什么我无法在 NASM Assembly 中打印我的数字常量?

标签 linux ubuntu assembly nasm 32-bit

在 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 复制到这个位置。但是我得到一个错误提示

invalid combination of opcode and operands

所以基本上,为什么程序不打印 5?还有,为什么我上面的建议无效?

最佳答案

要使用 int 0x80 和代码 4 进行打印,您需要将 ECX 作为要打印的字节的地址。在调用 print 例程之前,您将 '0' 添加到 ECX 中的 num 地址,因此它是内存中某处其他内容的地址。

您可能想要这样的东西。我创建了一个单独的区域,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

关于linux - 为什么我无法在 NASM Assembly 中打印我的数字常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18807543/

相关文章:

linux - 内核模块升级,停机时间最短且无需重新启动

linux - 设置自定义 shell 脚本和目录的权限

eclipse - 设置 Eclipse 以遵循系统类路径

assembly - x86组装设备vs =

c - 可变参数函数中的参数如何在堆栈上传递?

linux - 内核升级后apt-get自动提示消失

linux - 如何让MongoDB的mongorestore更新和替换具有相同_id的文件

git - 私有(private) GIT SSH 提示输入密码,可以 SSH 到远程存储库而无需密码

python - 导入 matplotlib 时出错,除非使用 anaconda

assembly - MIX DIV 运算符,以及打包字节数的转换