从今天起,转战优快云的blog,把之前写过的东西一点一点发出来和大家分享一下,希望能在和大家的交流中不断进步。
今天发一个学习MSAM的Win32汇编写的一个例子,99乘法表,当然没什么技术含量,菜鸟学习之用。
.386
.model flat , stdcall
;需要用到的文件引入
include windows.inc
include kernel32.inc
include msvcrt.inc
includelib msvcrt.lib
includelib kernel32.lib
;数据区
.data
szNum db 25h, 64h, 78h, 25h, 64h, 3dh, 25h, 64h, 09h, 0h ;这里其实就是字符串“%dx%d=%d”
szNLine db 0ah, 0h ;换行
ddRowCount dd 1 ;存储行
ddLineCount dd 1 ;存储列
;代码区
.code
start:
mov eax, ddLineCount
mov ebx, ddRowCount
imul eax, ebx ;做乘法
push eax
push ddRowCount
push ddLineCount
push offset szNum
call crt_printf ;调用类似C语言里的printf,之前4个push压如的数据就是给此处调用串的参数
mov eax, ddLineCount
mov ebx, ddRowCount
cmp eax, ebx ;比较一下行列是否相等,相等的话需要进入下一行结束此次循环
jz @f ;到这说明一行打印结束了,往后跳
inc eax ;列自增一下
mov ddLineCount, eax
jmp start ;执行到这,说明此行的乘法表还没结束,所以跳到开始继续循环
@@:
push offset szNLine
call crt_printf ;这里是为了打印个换行,要不把之前的都给覆盖掉了
mov ddLineCount, 1 ;初始化列变量
inc ddRowCount ;行要自增
mov ebx, ddRowCount
cmp ebx, 10 ;比较一下是不是到10了,99乘法表,10就不用打印了
jnz start ;不是10的话,说明还没打印完,跳到开始继续下一行打印
push NULL
call ExitProcess
end start
以上就是全部代码,当然调用函数的地方可以用invoke,不过感觉不如自己push舒服,所以就自己push了,这样一个小程序用汇编也不算复杂,当然在众多便捷操作和伪指令的帮助下,汇编看起来其实和写C差不多,只是感觉结构比较混乱。
今天发这点吧,当做一个开始,虽然技术含量基本没有,当然对菜鸟可能还是有一定帮助的。
Win32汇编实现:99乘法表
本文是作者在优快云博客上分享的关于学习MSAM的Win32汇编语言的一个简单实例,即编写99乘法表。尽管技术含量不高,但对于初学者来说是个不错的入门练习。作者选择手动push而非使用invoke,认为这样更直观。
749

被折叠的 条评论
为什么被折叠?



