zoukankan      html  css  js  c++  java
  • nasm过程调用

      通常都是将一些通用的功能封装成一些函数,然后方便以后的调用,现在来看一下在nasm中是如何实现的。

      先定义一个print.pro 的nasm过程文件,文件内容如下:

     1 print_char:
    2 pusha
    3 mov dl, al
    4 mov ah, 02h
    5 int 21h
    6 popa
    7 ret

      其中print_char, print_str就是过程的名字,每个过程需要使用ret去跳回调用者。  

      然后写一个调用print.pro的文件,proc.asm, 代码如下:

    [org 0x0100]
    [BITS 16]
    %include "print.pro"
    [section .data]
    msg DB 'hello', 0Dh, 0Ah, '$'
    [section .text]
    mov al, 65h
    call print_char
    ret

      使用%include导入我们的过程文件print.pro,然后通过AL传递一个参数,传递给print_char,再使用call调用指定的过程。不过发现屏幕上没有打印任何内容,这是为什么呢?这是因为com文件属于纯二进制格式,编译器是按照我们的输入方式和顺序进行编译的,产生的代码也是按照这个顺序。由于我们%include "print.pro"在程序的最前面,所以在程序编译运行的时候,其实先执行了print.pro的内容,可以通过debug命令,就能看出来。然后又因为,al和ax没有内容,所以没有输出任何东西。我们只要稍微改下程序,就可以了。

      修改后的程序,如下:

    1 [org 0x0100]
    2 [section .code]
    3 jmp start
    4 %include "print.pro"
    5 [section .code]
    6 start:
    7 mov al, 'A'
    8 call print_char
    9 ret

      在我们%include .pro文件之前,先执行我们自己定义的入口,这样就能争取打印字符了。


  • 相关阅读:
    scapy学习笔记(4)简单的sniffing 嗅探
    scapy学习笔记(3)发送包,SYN及TCP traceroute 扫描
    Linux查看CPU和内存使用情况
    MySQL关于根据日期查询数据的sql语句
    JSON 数据格式
    利用PyCharm进行Python远程调试
    pycharm远程调试配置
    Linux终端使用技巧
    每天一个linux命令(60):scp命令
    python-docx 使用教程
  • 原文地址:https://www.cnblogs.com/chobits/p/2291938.html
Copyright © 2011-2022 走看看