注册 登录
编程论坛 汇编论坛

这个该怎么下手呢?

studuan 发布于 2008-11-11 21:47, 1730 次点击
业余学了点汇编知识..看到书上编的比较2个数的大小,,,自己想做一个比较3个数大小的程序.可是实在不知道该怎么下手了..谁能发个程序给下思路啊,.,,
10 回复
#2
ONEPROBLEM2008-11-12 11:53
假设有X ,Y ,Z 三个数
ax 返回当中的最大数
伪代码如下:
mov ax,X  ;先定X为最大值
cmp ax,Y  ;X与Y比较
jb next   ;X<Y则跳转
cmp ax,Z  ;X>Y后,再与Z比较
jb next1  ;X<Z,则跳转
ret       ;否则,X最大,返回
next:
mov ax,Y  ;把Y当作最大值
cmp ax,Z  ;Y与Z比较
jb next1  ;Y<Z则跳转
ret       ;否则,Y最大,返回
next1:
mov ax,Z  ;Z是最大值
ret       ;返回
#3
ONEPROBLEM2008-11-12 11:55
不知道还有没有更加简洁的办法~~
#4
workhow2008-11-12 15:47
版主的功底可以做反向工程了吧.
#5
ONEPROBLEM2008-11-12 22:53
[bo][un]workhow[/un] 在 2008-11-12 15:47 的发言:[/bo]

版主的功底可以做反向工程了吧.

偶虽然顶着"版主"的高帽,其实还是个菜鸟~~
#6
你们都要疼我哦2008-11-13 00:53
先比2个, 结果再和第3个比.
#7
zklhp2008-11-13 13:15
[bo][un]你们都要疼我哦[/un] 在 2008-11-13 00:53 的发言:[/bo]

先比2个, 结果再和第3个比.


要是连续的话 用串操作是不是简单点?
#8
zklhp2008-11-13 16:50
程序代码:

;MASMPlus 代码模板 - 控制台程序

.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc

includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
    ;lpMsg    db "Hello World!",0
    num        dd 3,2,1,12131,3424,23424,23424,234242,9999999,1221,333
.data?
    buffer    db MAX_PATH dup(?)
    
.CODE
START:
    lea esi,num
    mov ecx,10d
@loop:
    lodsd
    cmp eax,DWORD ptr [esi]
    jb @next
    xchg eax,DWORD ptr [esi]
    mov edx,[esi]
@next:
    loop @loop
    
    invoke wsprintf,offset buffer,CTXT('%d'),edx
    invoke StdOut,offset buffer
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
    
end START
#9
zklhp2008-11-13 16:53
[bo][un]zklhp[/un] 在 2008-11-13 16:50 的发言:[/bo]


;MASMPlus 代码模板 - 控制台程序

.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc

include ...


关键看怎么评价算法了 要快还是要体积小

程序代码:

;MASMPlus 代码模板 - 控制台程序

.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc

includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
    ;lpMsg    db "Hello World!",0
    num        dd 3,2,1
.data?
    buffer    db MAX_PATH dup(?)
    
.CODE
START:
    lea esi,num
    xor ecx,ecx
    inc ecx
    inc ecx
@loop:
    lodsd
    cmp eax,DWORD ptr [esi]
    jb @next
    xchg eax,DWORD ptr [esi]
    mov edx,[esi]
@next:
    loop @loop
    
    invoke wsprintf,offset buffer,CTXT('%d'),edx
    invoke StdOut,offset buffer
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
    
end START
#10
zklhp2008-11-13 17:00
00401000 > CC               INT3
00401001   8D35 00304000    LEA ESI,DWORD PTR DS:[403000]
00401007   33C9             XOR ECX,ECX
00401009   41               INC ECX
0040100A   41               INC ECX
0040100B   AD               LODS DWORD PTR DS:[ESI]
0040100C   3B06             CMP EAX,DWORD PTR DS:[ESI]
0040100E   72 04            JB SHORT CONSOLE.00401014
00401010   8706             XCHG DWORD PTR DS:[ESI],EAX
00401012   8B16             MOV EDX,DWORD PTR DS:[ESI]
00401014  ^E2 F5            LOOPD SHORT CONSOLE.0040100B

21字节



00401016   66:A1 0C304000   MOV AX,WORD PTR DS:[40300C]
0040101C   66:3B05 0E304000 CMP AX,WORD PTR DS:[40300E]
00401023   72 0A            JB SHORT CONSOLE.0040102F
00401025   66:3B05 10304000 CMP AX,WORD PTR DS:[403010]
0040102C   72 11            JB SHORT CONSOLE.0040103F
0040102E   C3               RETN
0040102F   66:A1 0E304000   MOV AX,WORD PTR DS:[40300E]
00401035   66:3B05 10304000 CMP AX,WORD PTR DS:[403010]
0040103C   72 01            JB SHORT CONSOLE.0040103F
0040103E   C3               RETN

这个是多少字节偶算不出来了 呵呵
#11
zklhp2008-11-14 12:46
[bo][un]zklhp[/un] 在 2008-11-13 17:00 的发言:[/bo]

00401000 > CC               INT3
00401001   8D35 00304000    LEA ESI,DWORD PTR DS:[403000]
00401007   33C9             XOR ECX,ECX
00401009   41               INC ECX
0040100A   41               I ...


要实现这个功能最少多少字节呀 怎么再减小体积?
1