希望高手能帮我解决这个汇编问题,急,谢谢!(100分)

  • 主题发起人 主题发起人 FLY_IN_SKY
  • 开始时间 开始时间
F

FLY_IN_SKY

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:
用汇编编程实现
输入20个十进制数(2位或3位)排序后输出结果
我不懂汇编,随意希望能直接给出源码,如果问题解决啦,再给200分,绝不食言。
 
纠正:
我不懂汇编,所以希望能直接给出源码,如果问题解决啦,再给200分,绝不食言。
 
如果感觉分不够,可以再加,我现在可用积分1608,全给都行。
 
输出结果是什么概念?在屏幕上打印出来?
只是排序应该很好做呵,10分钟就可以敲出一个选择排序的程序呵。
 
谢谢,谢谢,终于有高手回复啦。
输出结果在屏幕显示就ok啦,输入的常量可以在程序中直接定义。
谢谢,急,请尽快。
 
ha ha ha !!! 300分可以到手了!!!
看招(已经调试过):
Var
_N : Word;
// _N Dw 20 ;
要排序多少个数字
_Dec : Packed Array [1..20] Of Word;
// 要排序的数字,自己填在里面,例如
// ;
_Dec Dw 351,3,99,118,15,256,1235,17,25,331,
// Dw 95,999,68,13,21,251,5235,137,25,391
I : Word;
// I Dw 0
J : Word;
// J Dw 0
Procedure AsmSort;
begin
// 下面为调试的数据,在汇编中你可以直接在上面用Dw 定义
_N:=20;
_Dec[1]:=351;
_Dec[2]:=3;
_Dec[3]:=99;
_Dec[4]:=118;
_Dec[5]:=15;
_Dec[6]:=256;
_Dec[7]:=1235;
_Dec[8]:=17;
_Dec[9]:=25;
_Dec[10]:=331;
_Dec[11]:=95;
_Dec[12]:=999;
_Dec[13]:=68;
_Dec[14]:=13;
_Dec[15]:=21;
_Dec[16]:=251;
_Dec[17]:=5235;
_Dec[18]:=137;
_Dec[19]:=25;
_Dec[20]:=391;

// ;开始汇编排序
Asm
Mov Word Ptr I,1
@@1:
Mov Ax,I
Inc Ax
Mov Word Ptr J,Ax
@@3:
// ;
得到数字的起始地址:
Mov Ax,Word Ptr J
Mov Bl,2
Mul Bl
Xor ECx,ECx
Sub Ax,2
Mov Cx,Ax
Mov Ax,Word Ptr I
Mov Bl,2
Mul Bl
Sub Ax,2
Xor EBx,EBx
Mov Bx,Ax
Mov EAx,EBx
LEA EBX,_Dec
//;
比较两个数字
Mov SI,Word Ptr [EBx+EAx]
Mov DI,Word Ptr [EBx+ECx]
Cmp SI,DI
Jle @@5 // ;升序
// Jg @@5 // ;降序
//;
交换
Mov Word Ptr [EBx+EAx],DI
Mov Word Ptr [EBx+ECx],SI
@@5:
Mov Ax,Word Ptr _N
Inc Word Ptr J
Cmp Word Ptr J,Ax
Jle @@3
Mov Ax,Word Ptr _N
Inc Word Ptr I
Cmp Word Ptr I,Ax
Jl @@1
end;
// 这时候_Dec中已经按升序排好了!!!
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
AsmSort;
Halt(0);
end;
 
wql老大,这个,这个,是用delphi写好代码,反编译回来的吧。
其实这招俺也会,只不过这些代码是否能用masm调试啊?还有你的代码里是否有在
屏幕上显示的代码啊?唉~~,俺不懂汇编,可不要蒙俺啊。希望直接给出可以在masm调
试的代码,谢谢!!!!!!
当然,问题解决的好,分一定会给的。
 

可爱的小土鳖 ^_^ ^_^ ^_^,不要生气 !!! 上面的程序是我自己写的。
wql是汇编方面的高手,请你把问题说得清楚些,是DOS下的程序
(或你的作业)是吗?
编译成EXE还是COM文件?
这种程序,89年上VAX机汇编时就做过的,小Case !!!
以后汇编方面的问题,到"系统相关"中找我解决就行了,当然要给我加分了! ha ha ha !
 
谢谢wql老大,说老实话,这是俺的一个朋友的作业,她学的是《8086/8088汇编语言》,应该是
dos下的程序,至于编译成exe还是com,俺就不太了解啦,这个,有什么区别嘛?
都怪俺,爱说大话,俺天天都是用delphi编数据库方面的程序,3年前学的汇编早都忘光啦,
书也找不到,答应人家的事却解决不了,真是惭愧,所以还望wql老大多多费心啦。
至于分数,绝对会让您满意的。
加油!!! p(^-^)q
 

继续看招,已经调试过:

;
;
用MASM或TASM编译
;
用LINK或TLINK连接
;
例如:
;
TASM ASMSORT
;
TLINK ASMSORT
;
执行ASMSORT即可。
;
哈哈哈 !!!
;
Code Segment
Assume Cs:Code,Ds:Code
Start:
Jmp Init
_N EQU 20 ;
20个数字
I Dw 0
J Dw 0
;
要排序的数字(20个),自己填在里面,例如:
_Dec Dw 351,3,99,118,15,256,1205,17,25,331
Dw 95,999,68,13,21,251,5235,137,25,391
AsmSort Proc Near
Push Cs
Pop Ds
Mov Word Ptr I,1
@@11:
Mov Ax,I
Inc Ax
Mov Word Ptr J,Ax
@@13:
;
得到数字的起始地址:
Mov Ax,Word Ptr J
Mov Bl,2
Mul Bl
Mov SI,Ax
Sub SI,2
Mov Ax,Word Ptr I
Mov Bl,2
Mul Bl
Sub Ax,2
Mov DI,Ax
LEA BX,_Dec
Add SI,Bx
Add DI,Bx
;
比较两个数字
Mov Ax,Word Ptr [SI]
Mov Cx,Word Ptr [DI]
Cmp Ax,Cx
Jle @@15 ;升序
;;
Jg @@15 ;降序
;
交换
Mov Word Ptr [SI],Cx
Mov Word Ptr [DI],Ax
@@15:
Mov Ax,_N
Inc Word Ptr J
Cmp Word Ptr J,Ax
Jle @@13
Mov Ax,_N
Inc Word Ptr I
Cmp Word Ptr I,Ax
Jl @@11
Ret
AsmSort EndP
ShowOne Proc Near
;
显示Ax的内容
Push Cs
Pop Ds
Mov Bx,10000
Mov Cx,5
@@21:
Push Cx
Push Ax
Xor Dx,Dx
Div Bx
Mov Cl,Al
;
显示
Mov Ah,0Eh
Add Al,'0'
Int 10h
Pop Ax
;
求余数
Push Ax
Xor Dx,Dx
Xor Ah,Ah
Mov Al,Cl
Mul Bx
Mov Cx,Ax
Pop Ax
Sub Ax,Cx
;
Bx = Bx Div 10
Push Ax
Xor Dx,Dx
Mov Ax,Bx
Mov Cx,10
Div Cx
Mov Bx,Ax
Pop Ax
Pop Cx
Loop @@21
Ret
ShowOne EndP
ShowRes Proc Near
;
把_Dec中的20个数字显示出来
Push Cs
Pop Ds
LEA BX,_Dec
Mov Cx,_N
@@31:
Mov Ax,Word Ptr [Bx]
Push Cx
Push Bx
Call ShowOne
;
显示间隔的","
Mov Ah,0Eh
Mov Al,','
Int 10h
Pop Bx
Pop Cx
Add Bx,2
Loop @@31
Ret
ShowRes EndP
_BSort Db 13,10,'Source Data: ',13,10,'$' ;
排序前
_LSort Db 13,10,13,10,'Last Data: ',13,10,'$' ;
排序后
_Ok Db 13,10,13,10,'Ok !!!',13,10,'$' ;
结束
Init:
Push Cs
Pop Ds
;
显示排序前数字
LEA Dx,_BSort
Mov Ah,9
Int 21h
Call ShowRes
;
排序
Call AsmSort
;
显示排序后数字
LEA Dx,_LSort
Mov Ah,9
Int 21h
Call ShowRes
;
显示结束
LEA Dx,_Ok
Mov Ah,9
Int 21h
;
程序终止
Mov Ax,4C00h
Int 21h
Code EndS
End Start
 
请问wql如何用汇编实现关机功能的程序,(不是“重启动”)。
 
谢谢wql老大,有劳您费心啦,要多少分,请说话,一定双手封上。
 

1. 至于排序的问题,300分就够了!!! 你重新开辟一个问题,给我另外200分即可。
2. “用汇编实现关机功能”在DOS下是不能实现的,不知道你有没有Win9x下的
汇编编译器,总之比DOS下的复杂多了,要在汇编里面调用User32.dll里面的
ExitWindowsEx函数。
3. 为何你要在汇编里面实现Windows的功能? 太麻烦了!!!
 
谢谢老大,请到此贴拿分,另外再帮小弟解决一个问题,谢谢!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=548219
 
后退
顶部