win32汇编环境,怎么进行加法运算的

;运行效果

;win32汇编环境,怎么进行加法运算的

;基础知识,重新复习一下。

;首先需明白字节的概念。1个字节是8位,al和ah都是8位的,8位之中每位要么是0,要么是1,假如8位都是1,就是16进制的FF,也就是10进制的255,所以说al或ah最多为255,超过它就会报错。

;你输入mov al,256 然后编译,就会报错。但是输入mov al,255 就可以编译。

;假设两个相加的值都是255,结果肯定超过255,不管是al还是ah都放不下,那结果就放ax这儿。al和ah合起来就是ax,ax是双字节,有16位,如果16位全是1,那就是16进制的FFFF,也就是65535。

;我们常使用eax,有4字节,就是32位,一般够用了。

;直接抄进RadAsm可编译运行。重要部分加备注。

;下面为asm文件

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.386

.model flat,stdcall

option casemap:none

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Include 文件定义

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include windows.inc

include user32.inc

include kernel32.inc

includelib user32.lib

includelib kernel32.lib

; 自定义函数声明

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; 数据段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.data

DlgName db "MyDialog",0

szSucceesCap db "提示",0

szCheshi_template db "结果是 %d",0

.data?

hInstance HINSTANCE ?

.const

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

; Equ 等值定义

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

ICO_MAIN equ 1000 ;图标

IDB01 equ 21

IDB02 equ 22

IDB03 equ 23

IDB04 equ 24

; 代码段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

.code

start:

invoke GetModuleHandle, NULL

mov hInstance,eax

invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL

invoke ExitProcess,eax

DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

LOCAL @Buffer[256]:byte

LOCAL @A:DWORD

.if uMsg == WM_INITDIALOG

invoke LoadIcon,hInstance,ICO_MAIN ;加载图标

invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax

.elseif uMsg==WM_COMMAND

mov eax,wParam

.if eax == IDB01

;以下为寄存器相加模式

mov eax,100

mov ebx,150

add eax,ebx ;相当于eax+ebx,再把结果放eax里面,eax与ebx可以反过来,如果反过来,则结果在ebx里

invoke wsprintf,addr @Buffer,addr szCheshi_template,eax ;相加的结果在eax里,所以这里放eax

invoke MessageBox,hWnd,addr @Buffer,addr szSucceesCap,MB_OK or MB_ICONINFORMATION

.elseif eax == IDB02

;以下为存储器相加模式

mov eax,200

mov @A,250 ;@A是前面定义的四字节变量地址,里面的值现在是250,那地址是多少,这个得由系统分配。写外挂的就是专门找这些地址,然后改动它,就可以改数据了。

add @A,eax ;相当于把@A这个内存地址里的值+eax,结果放@A地址里

invoke wsprintf,addr @Buffer,addr szCheshi_template,@A

invoke MessageBox,hWnd,addr @Buffer,addr szSucceesCap,MB_OK or MB_ICONINFORMATION

.elseif eax == IDB03

;以下为立即数相加模式

mov eax,400

add eax,450 ;450是立即数,相当于eax+450,然后把结果保存在eax里,这里两个数位置不能反过来,因为这种模式450这个值会固定在生成的exe文件里,不能改动它。

invoke wsprintf,addr @Buffer,addr szCheshi_template,eax

invoke MessageBox,hWnd,addr @Buffer,addr szSucceesCap,MB_OK or MB_ICONINFORMATION

.endif

.elseif uMsg == WM_CLOSE

invoke EndDialog, hWnd,NULL

.else

mov eax,FALSE

ret

.endif

mov eax,TRUE

ret

DlgProc endp

end start

;下面为rc文件内容

#include "resource.h" //提示缺少该文件,可以在资源里下载

#define ICO_MAIN 1000 //图标

#define IDB01 21

#define IDB02 22

#define IDB03 23

#define IDB04 24

ICO_MAIN ICON "Main.ico"

//定义对话框

MyDialog DIALOG 10, 10, 190, 90

STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

CAPTION "对话框程序模版"

BEGIN

CTEXT "100 + 150 = ?", -1, 5, 20, 70, 19

CTEXT "200 + 250 = ?", -1, 5, 40, 70, 19

CTEXT "400 + 450 = ?", -1, 5, 60, 70, 19

PUSHBUTTON "点我看寄存器加法结果", IDB01, 70,18,100,12

PUSHBUTTON "点我看存储器加法结果", IDB02, 70,37,100,14

PUSHBUTTON "点我看立即数加法结果", IDB03, 70,56,100,14

END

相关推荐
我在人间贩卖青春11 天前
汇编之伪指令
汇编·伪指令
我在人间贩卖青春12 天前
汇编之伪操作
汇编·伪操作
济61712 天前
FreeRTOS基础--堆栈概念与汇编指令实战解析
汇编·嵌入式·freertos
myloveasuka12 天前
汇编TEST指令
汇编
我在人间贩卖青春12 天前
汇编编程驱动LED
汇编·点亮led
我在人间贩卖青春12 天前
汇编和C编程相互调用
汇编·混合编程
myloveasuka13 天前
寻址方式笔记
汇编·笔记·计算机组成原理
请输入蚊子13 天前
《操作系统真象还原》 第六章 完善内核
linux·汇编·操作系统·bochs·操作系统真像还原
myloveasuka13 天前
指令格式举例
汇编·笔记·计算机组成原理
我在人间贩卖青春13 天前
汇编之分支跳转指令
汇编·arm·分支跳转