NASM汇编学习系列(6)——示例打印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是换行'\n',第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

猜你喜欢

转载自www.cnblogs.com/whuwzp/p/nasm_0-10.html