说明
- 本学习系列代码几乎完全摘自:asmtutor.com,如果英文可以的(也可以用谷歌浏览器翻译看),可以直接看asmtutor.com上的教程
- 本学习系列目录地址:https://www.cnblogs.com/whuwzp/p/nasm_contents.html
- 系统环境搭建:(我用的是ubuntu18.04.4 server,安装gcc、g++)
sudo apt install nasm
sudo apt install gcc-multilib
0. 概览
- 承前:无
- 启后:本节,作为示例,打印0~10,这节其实类似之前sprintlf实现打印换行。
1. 打印0到9
数字0到9的ascii为0x30~0x39,类似第3节中sprintLf中换行的实现,0x0Ah是换行' ',第3节打印的是0x0A,这里打印的是0x30,0x31...
%include 'function.asm'
SECTION .text
global _start
_start:
mov ecx, 30h ; ecx一般用做计数器
nextnum:
cmp ecx, 3Ah ; 等于0x3A就表明完了
jz countfinished
push ecx ; 此时esp指向的栈上地址的内容为0x30 0x00 0x00 0x00
mov eax, esp ; 打印esp指向的栈上地址
call sprintLF
inc ecx
jmp nextnum
countfinished: call quit
2. 打印10
打印10稍微有点不同,因为0x3Ah并不是10,我得想办法打印出1,然后跟着0,组合成10.
mov eax, 00003031h ;
push eax ;此时esp指向的栈上地址的内容为0x31 0x30 0x00 0x00
mov eax, esp
call sprintLF ;这样打印的话就是10