NASM汇编学习系列——示例打印0到10

Posted whuwzp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NASM汇编学习系列——示例打印0到10相关的知识,希望对你有一定的参考价值。

说明

  1. 本学习系列代码几乎完全摘自:asmtutor.com,如果英文可以的(也可以用谷歌浏览器翻译看),可以直接看asmtutor.com上的教程
  2. 本学习系列目录地址:https://www.cnblogs.com/whuwzp/p/nasm_contents.html
  3. 系统环境搭建:(我用的是ubuntu18.04.4 server,安装gcc、g++)
sudo apt install nasm
sudo apt install gcc-multilib

0. 概览

  1. 承前:无
  2. 启后:本节,作为示例,打印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

以上是关于NASM汇编学习系列——示例打印0到10的主要内容,如果未能解决你的问题,请参考以下文章

NASM汇编学习系列——使用bss段和获取用户输入

了解汇编、nasm、x86 中的 printf 函数。我不知道为啥这段代码没有打印出任何东西

汇编学习笔记-汇编程序的基本语法(NASM)

如何使用 gcc 生成可以用 nasm 编译的汇编代码 [重复]

CentOS7写汇编并编译运行汇编代码

执行汇编代码时控制台上的垃圾字符