汇编实现之99乘法表

从今天起,转战CSDN的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差不多,只是感觉结构比较混乱。

今天发这点吧,当做一个开始,虽然技术含量基本没有,当然对菜鸟可能还是有一定帮助的。

你可能感兴趣的:(汇编)