艾特商业网

关于汇编语言程序相对于高级程序设计语言(关于汇编语言程序)

更新时间:2023-11-03 09:41:19

导读 你们好,最近小艾特发现有诸多的小伙伴们对于关于汇编语言程序相对于高级程序设计语言,关于汇编语言程序这个问题都颇为感兴趣的,今天小活

你们好,最近小艾特发现有诸多的小伙伴们对于关于汇编语言程序相对于高级程序设计语言,关于汇编语言程序这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。

1、 下载安装emu8086(8086装配仿真工具),打开运行软件,新文件命名为xiaobocalculator.asm

2、 输入以下代码

3、 ;==将值赋给DD数字X的宏==将Y的值赋给DD类型的两个数字X和Y。

4、 give macro x,y

5、 mov ax,y

6、 mov x,ax

7、 mov ax,y[2]

8、 mov x[2],ax

9、 endm

10、 ;* *将值赋给DD数字X的宏* *将Y的值赋给DD类型的两个数字X和Y。

11、 ;==判断正反宏==用两个常数fhx和fhy判断DD型X和Y的正反,并记录下来。

12、 ;都换算成正数便于操作。

13、 judge macro x,y

14、 本地判断1、判断2、判断3、判断4;标签注释,用于确保宏的重复调用。

15、 ;定位标签挺乱的。

16、 mov ax,x

17、 cmp ax,0

18、 jge judge1

19、 mov fhx,1;记录x的正负。

20、 阴性x;转换成正数

21、 judge1:

22、 mov ax,x[2]

23、 cmp ax,0

24、 jge judge2

25、 mov fhx,1

26、 neg x[2]

27、 judge2:

28、 mov ax,y

29、 cmp ax,0

30、 jge judge3

31、 mov fhy,1

32、 neg y

33、 judge3:

34、 mov ax,y[2]

35、 cmp ax,0

36、 jge judge4

37、 mov fhy,1

38、 neg y[2]

39、 judge4:

40、 endm

41、 ;* *正负宏判断结束* *

42、 ;==根据中间Y值的0,1将X结果变为正值或负值==

43、 change macro x,y

44、 local change1

45、 cmp y,0

46、 je change1

47、 neg x

48、 neg x[2]

49、 change1:

50、 endm

51、 ;* *根据中间Y值的0,1,将X结果变为正值或负值* *

52、 ;==进位宏的开始==小数部分除以100,进位商,将余数补足到小数。

53、 carry macro x

54、 推CX;避免干扰宏外部的CX和DX值。

55、 push dx

56、 mov ax,x[2]

57、 mov cx,100

58、 mov dx,0

59、 div cx

60、 mov x[2],dx

61、 add x,ax

62、 pop dx

63、 pop cx

64、 endm

65、 ;* *进位宏结束* *

66、 ;==新加法宏开始==算法,用相同的符号加法,用不同的符号减法。

67、 newadd macro x,y

68、 local subsub,endnewadd,returnadd1,xbig,endadd1,endadd2,endadd3,endadda,endaddc

69、 Referee number three, referee number four; Can't directly substitute x, y.

70、 ;x实际上既是$ NUMBER 3又是$ number4。原因,下面有说明。

71、 mov ax,fhx

72、 cmp fhy,ax

73、 jnesubsub

74、 ;-如果两个数符号相等,则两部分直接相加。

75、 mov ax,y

76、 addx,ax

77、 mov ax,y[2]

78、 add x[2],ax

79、 carry number3

80、 change number3,fhx

81、 jmp endnewadd

82、 ;-如果符号相反,从大数中减去小数。

83、 subsub:

84、 mov ax,y

85、 cmp x,ax

86、 jaxbig

87、 jne endadda

88、 mov ax,y[2]

89、 cmp x[2],ax

90、 ja xbig

91、 endadda:

92、 mov ax,x

93、 sub y,ax

94、 add y[2],100

95、 mov ax,x[2]

96、 sub y[2],ax

97、 cmp y[2],100

98、 jnb endadd1

99、 sub y,1

100、 jmp endaddc

101、 endadd1:

102、 sub y[2],100

103、 endaddc:

104、 give number3,number4

105、 change number3,fhy

106、 jmp endnewadd

107、 xbig:

108、 mov ax,y

109、 sub x,ax

110、 add x[2],100

111、 mov ax,y[2]

112、 sub x[2],ax

113、 cmp x[2],100

114、 jnb endadd2

115、 sub x,1

116、 jmp endadd3

117、 endadd2:

118、 sub x[2],100

119、 endadd3:

120、 change number3,fhx

121、 jmp endnewadd

122、 endnewadd:

123、 mov fhx,0

124、 mov fhy,0

125、 endm

126、 ;* *新增宏结束* *

127、 ;==新减法宏==

128、 newsub macro x,y

129、 mov fhx,1

130、 change number4,fhx

131、 mov fhx,0

132、 newadd number3,number4

133、 endm

134、 ;* *新减法宏* *

135、 ;==新乘法宏==算法(A1 B1)*(a2 B2)=A1 * a2 A1 * B2 a2 * 1 B1 * B2

136、 newmul macro x,y

137、 judge number3,number4

138、 push bx

139、 push dx

140、 mov bx,y

141、 mov ax,x

142、 mul bx

143、 推斧;堆叠用于以后添加。

144、 mov ax,x[2]

145、 mul bx

146、 推斧;正数部分乘以小数部分的结果可以直接加到小数部分。

147、 mov bx,y[2]

148、 mov ax,x

149、 mul bx

150、 push ax

151、 mov ax,x[2]

152、 mul bx

153、 mov dx,0

154、 mov bx,100;小数部分乘以小数部分的结果必须减少100倍。

155、 ;可以加回小数位

156、 div bx

157、 mov x[2],ax

158、 pop ax

159、 add x[2],ax

160、 pop ax

161、 add x[2],ax

162、 pop ax

163、 mov x,ax

164、 carry number3

165、 mov ax,fhy

166、 xor fhx,ax

167、 change number3,fhx

168、 mov fhx,0

169、 mov fhy,0

170、 pop dx

171、 pop bx

172、 endm

173、 ;* *新乘法宏* *

174、 ;==新除法宏==除法是由减法完成的,但是为了减少减法的次数,所以

175、 ;先用a1/(a2 ^ 1)求一个商,一定不能大于递减。

176、 ;次数,所以可以从(a1 b1)-商*(a2 b2)中减去。

177、 ;减去负数后,加上a (a2 b2)得到(a3 b3)。此时此刻

178、 ;等待的次数是结果的整数部分。最后,(a3 b3)*100

179、 ;按照前面的方法,可以得到结果的两个小数部分。

180、 newdiv macro x,y

181、 local endnewdiv

182、 push bx

183、 push dx

184、 push cx

185、 judge number3,number4

186、 give fhdx,fhx

187、 mov fhx,0

188、 mov fhy,0

189、 give divn4,number4

190、 intdiv number3,number4;求结果的整数部分

191、 mov bx,100;将减少的盈余扩大100倍。

192、 mov ax,number3

193、 mul bx

194、 mov number3,ax

195、 mov ax,数字3[2];小数位放大100倍,相当于直接输入整数位。

196、 add number3,ax

197、 mov number3[2],0

198、 give number4,divn4

199、 intdiv number3,number4;求结果的小数部分

200、 pop number3[2]

201、 pop number3

202、 endnewdiv:

203、 mov ax,fhdy

204、 xor fhdx,ax

205、 change number3,fhdx

206、 mov fhdx,0

207、 mov fhdy,0

208、 pop cx

209、 pop dx

210、 pop bx

211、 endm

212、 ;* *新部门宏* *

213、 ;==除法递减宏==

214、 intdiv macro x,y

215、 Local intdiv1, intdiv2, endintdiv; Embedded macro, used to decrease gradually

216、 mov ax,x

217、 mov bx,y

218、 add bx,1

219、 mov dx,0

220、 div bx

221、 push ax

222、 mov bx,y

223、 mul bx

224、 mov y,ax

225、 pop ax

226、 push ax

227、 mov bx,y[2]

228、 mul bx

229、 mov y[2],ax

230、 carry number4

231、 pop cx

232、 newsub number3,number4

233、 给数字4,divn4防止# number4的值在相减后被改变。

234、 intdiv1:

235、 newsub number3,number4

236、 give number4,divn4

237、 inc cx

238、 cmp number3,0

239、 jl endintdiv

240、 je intdiv2

241、 jmp intdiv1

242、 intdiv2:

243、 cmp number3[2],0

244、 jl endintdiv

245、 jmp intdiv1

246、 endintdiv:

247、 newadd number3,number4

248、 dec cx

249、 push cx

250、 endm

251、 ;* *除法递减宏* *

252、 ;==设置光标宏==

253、 curse macro cury,curx

254、 mov ah,2

255、 mov dh,cury

256、 mov dl,curx

257、 mov bh,0

258、 int 10h

259、 endm

260、 ;* *设置光标宏* *

261、 ;==定位字符串显示宏==

262、 菜单宏op1、op2、op3菜单显示宏定义了op3的内容显示到OP1和OP2的位置。

263、 mov ah,02h

264、 mov bh,00h

265、 mov dh,op1

266、 mov dl,op2

267、 int 10h

268、 mov ah,09h

269、 lea dx,op3

270、 int 21h

271、 endm

272、 ;* *定位字符串显示宏* *

273、 ;==清屏加彩色宏==

274、 scroll macro n,ulr,ulc,lrr,lrc,att

275、 mov ah,06

276、 mov al,n;N=卷起线的数量;当n=0时,整个窗口是空白的。

277、 mov ch,ulr左上角行号

278、 mov cl,ulc左上角列号

279、 mov dh,lrr右下角行号

280、 mov dl,lrc右下角的列号

281、 mov bh,att涉及的线属性

282、 int 10h

283、 endm

284、 ;* *清晰屏幕加彩色宏* *

285、 ;;;;;程序开始

286、 data segment

287、 fhx dw 0;记录x值的正负

288、 fhy dw 0;记录y值的正负

289、 fhdx dw 0;记录除法运算中的x值正负

290、 fhdy dw 0;记录除法运算中的y值正负

291、 divn4 dd 0;除法中帮助暂存number4

292、 number0 db 100;计入键盘输入字符串

293、 db 0

294、 db 100 dup(0);

295、 number dw 200 dup(0);存入输入公式处

296、 number2 dw 200 dup(0);读取去括号后的公式暂存处

297、 number3 dd 0;存储用于计算的x数

298、 number4 dd 0;存储用于计算的y数

299、 crx db 20;记录光标列

300、 cry db 10;记录光标行

301、 crx2 db 2;记录光标列2

302、 cry2 db 2;记录光标行2

303、 memb dw 0;记录bx中的值是否储存过

304、 memx db 0;记录是否应该进入小数存储部分

305、 memcl db 0;记录已经存储到小数的第几位

306、 rsi dw 0

307、 begain db 'Xiaobo Welcome you to use the calculator!','$'

308、 begain1 db 'data:2014/4/23','$'

309、 begain2 db '****Designed by 1wangxiaobo@163.com!****','$'

310、 begain3 db ' http://hi.baidu.com/yedeqixian','$'

311、 begain4 db ' ^Henan University of Economics and Law^$','$'

312、 begain5 db 'press 'E' key to exit','$'

313、 begain6 db 'press any key to contiune','$'

314、 begain7 db 'Press 'Enter' key to introudction','$'

315、 help db 'Confine:32512.99~(-32768.00)','$'

316、 help1 db 'Format: 1.32*99+(98.43/(-34))=','$'

317、 help2 db 'Notice 1:negative must like (-x)','$'

318、 help3 db ' 2:only can abet double decimal fraction as 567.33','$'

319、 help4 db 'press any key go on!','$'

320、 error1 db ' Error!',13,10,'$'

321、 DBUFFER DB 8 DUP (':'),12 DUP (' ');时间的底

322、 data ends

323、 code segment

324、 assume cs:code,ds:data,es:data

325、 start:

326、 mov ax,data

327、 mov ds,ax

328、 mov ax,data

329、 mov es,ax

330、 ;----欢迎界面-----

331、 scroll 0,0,0,24,79,0;清屏

332、 scroll 25,0,0,24,79,50h;开外窗口,品红底

333、 scroll 21,2,2,22,77,0fh;开内窗口,黑底白字

334、 menu 4,20,begain

335、 menu 6,20,begain1

336、 menu 8,20,begain2

337、 menu 10,20,begain3

338、 menu 12,20,begain4

339、 menu 14,20,begain5

340、 menu 16,20,begain6

341、 menu 18,20,begain7

342、 mov ah,01

343、 int 21h

344、 cmp al,0dh;'Enter'

345、 jne helpo

346、 scroll 21,2,2,22,77,0fh;清屏,内窗

347、 menu 6,20,help

348、 menu 8,20,help1

349、 menu 10,20,help2

350、 menu 12,20,help3

351、 menu 14,20,help4

352、 mov ah,01

353、 int 21h

354、 scroll 21,2,2,22,77,0fh;清屏,内窗

355、 jmp start1

356、 helpo:

357、 cmp al,45h;'E'

358、 je exit

359、 scroll 21,2,2,22,77,0fh;清屏,内窗

360、 ;----清零处理-----

361、 start1:

362、 call time

363、 start3:

364、 curse 10,25;光标定位中间

365、 mov cx,200

366、 mov si,0

367、 sclear:

368、 mov number[si],0

369、 add si,2

370、 loop sclear

371、 mov cx,0

372、 mov si,0

373、 mov bx,0

374、 mov crx,25

375、 scroll 1,10,25,10,77,0fh;清除原来等式

376、 ;---开始----

377、 call write

378、 call loopcount

379、 curse cry,crx

380、 call output

381、 mov ah,01

382、 int 21h

383、 scroll 1,cry2,2,cry2,77,0fh;清除原来等式

384、 menu cry2,crx2,number0[2]

385、 inc cry2

386、 cmp cry2,10

387、 jl start2

388、 mov cry2,2

389、 start2:

390、 jmp start1

391、 exit:

392、 mov ah,4ch

393、 int 21h

394、 ;;;;;程序结束

395、 ;====写入函数======

396、 ;数据格式:定义一个DD双字数组,双字的第一个字存数的整数部分,第二个字

397、 ; 存数的小数部分。但是为了最后的输出方便,以及乘法运算的小数

398、 ; 部分运算后向整数部分进位,小数部分采用100进一制

399、 ;存数范围:十进制32512.99~(-32767.00),十六进制7F00.63~8001.00(补码)

400、 ;存数算法:整数部分正数ai=ai*10+a(i+1),负数对正数求补码

401、 ; 小数部分正数bi=b1*10+b2,负数对正数求补码

402、 ;存数说明:采用单个字符一个一个输入的方式,字符为0~9时进入存数算法,当输

403、 ; 入是运算符号时结束存数算法,并且开始存数及存运算符.但是这里要

404、 ; 考虑一个问题不能每次有运算符号进入时都存数,比方A+((X)),如果每

405、 ; 次都存,A就会被存3次.所以这里我们定义了一个常数remb记录每个数存

406、 ; 入情况,方便存数时判断

407、 ;负数处理:负数的介入要求格式为(-X),因为在读取部分,会依次去括号,这样就

408、 ; 变为了-X,所以只需要判断一串公式开头位'-'号,就知道介入的为负

409、 ; 数,再直接对X求补。(注:这步处理放在支持混合运算的si_ze宏部分)

410、 ;小数处理: 通过介入'.'来判断是否开始存入小数部分

411、 ;特别说明: 1:由于运算符号的ASCLL较小,会与介入的数字相等,所以把运算符的

412、 ; ASCLL码加上7F00H在存入,这样也就要把7F00H~7FFFH预留给运算

413、 ; 符号,同时这也会导致存数范围的缩小,不过个人觉得是值的.

414、 ;输入格式: 按照平时正常等式的输入方式输入,以等号结尾.

415、 ; 例如:11*(1-3)/(-3)=

416、 write proc near

417、 ;--写入函数主部分----

418、 startw:

419、 lea dx,number0

420、 mov ah,0ah

421、 int 21h

422、 xor cx,cx

423、 mov cl,number0[1]

424、 mov si,cx

425、 add si,2

426、 mov rsi,si

427、 mov si,0

428、 mov di,2

429、 mov bx,0

430、 startw2:

431、 mov al,number0[di]

432、 inc di

433、 inc crx

434、 mov ah,0

435、 cmp al,45h;'E' 用于程序退出

436、 jz exit

437、 cmp al,2ah;'*'

438、 jz memory;转入存数及存运算符

439、 cmp al,2fh;'/'

440、 jz memory

441、 cmp al,2bh;'/'

442、 jz memory

443、 cmp al,2dh;'-'

444、 jz memory

445、 cmp al,29h;')'

446、 jz memory

447、 cmp al,28h;'('

448、 jz memory

449、 cmp al,2eh;'.'

450、 jz memoryx;转入存入小数程序

451、 cmp al,3dh;'='

452、 jz memory

453、 cmp al,0dh;'CR'

454、 jzendwrite

455、 sub al,30h;为存数算法做准备,让'1'真正变成二进制码的1

456、 cmp al,0

457、 jl error;报错程序

458、 cmp al,9

459、 ja error

460、 cmp memx,2

461、 je error

462、 cmp memx,1

463、 je arithmeticx;小数存数算法程序

464、 jmp arithmetic;整数存数算法程序

465、 ;---memory存入部分---

466、 memory:

467、 cmp memb,0;remb位0时表示数已经数存储过;注:开始为remb赋值时

468、 ;也一定要为0,因为这是为了防止'(1+3)*4'这样直接以运

469、 ;算符开始的等式

470、 je memory1

471、 mov number[si],bx;存入数

472、 cmp memx,1;

473、 je memory2;存小数部分程序

474、 add si,4

475、 gomemory1:

476、 add ax,7f00h;将运算符转换到7F00~7FFF之间

477、 mov number[si],ax;存入运算符

478、 mov memb,0;说明数已经存储过

479、 mov memx,0

480、 mov memcl,0

481、 mov bx,0

482、 add si,4

483、 loop startw2

484、 jmp endwrite

485、 memory1:只存运算符号

486、 add ax,7f00h

487、 mov number[si],ax

488、 add si,4

489、 loop startw2

490、 jmp endwrite

491、 memory2:

492、 add si,2

493、 jmp gomemory1

494、 ;-memoryx小数存入部分-

495、 memoryx:

496、 mov memx,1;当remx为1时表示开始准备小数存入

497、 mov number[si],bx

498、 mov bx,0

499、 add si,2;没有加四,应为这下是要转入存小数的下个字节

500、 loop startw2

501、 jmp endwrite

502、 ;-arithmetic存数算法--

503、 arithmetic:

504、 ;算法bx=bx*10+ax

505、 push ax

506、 mov ax,bx

507、 push cx

508、 mov cx,10

509、 mul cx

510、 pop cx

511、 pop bx

512、 add ax,bx

513、 mov bx,ax

514、 mov memb,1;说明开始存数

515、 cmp bx,7f00h;保证数在合适范围内

516、 jae error

517、 loop startw2

518、 jmp endwrite

519、 ;-arithmeticx存数算法--

520、 arithmeticx:

521、 cmp memcl,1

522、 je arithmetix1

523、 push cx

524、 mov cx,10

525、 mul cx

526、 add bx,ax

527、 pop cx

528、 mov memb,1

529、 inc memcl

530、 loop startw2

531、 jmp endwrite

532、 arithmetix1:

533、 add bx,ax

534、 inc memcl

535、 loop startw2

536、 jmp endwrite

537、 ;---error报错部分----

538、 error:

539、 curse cry,crx

540、 lea dx,error1

541、 mov ah,9

542、 int 21h

543、 jmp start1;重新运行程序

544、 endwrite:

545、 mov di,0

546、 ret

547、 write endp

548、 ;***写入函数结束***

549、 ;===去括号函数=====

550、 ;程序说明:比方'11+(3+99)='这个等式,先从number的首位开始每隔两个字取出数

551、 ; 与')'的现ASCLL码7f29h比较从而找到第一个')'的位置,再到回去找到

552、 ; 最近的'('的位置,从而将中间没括号的等式读出到number3中,接着利

553、 ; 用si_ze函数算出这个等式的值,并且赋值回number中,以替代原来的括

554、 ; 号及括号能的等式

555、 loopcount proc near

556、 startlp:

557、 mov bp,0

558、 mov di,0

559、 mov bx,0

560、 mov si,0

561、 startl:

562、 mov ax,number[si]

563、 cmp ax,7f29h

564、 je rsee

565、 add si,4

566、 cmp ax,7f3dh

567、 je lastl

568、 jmp startl

569、 rsee:

570、 sub si,4

571、 mov ax,number[si]

572、 cmp ax,7f28h

573、 je rwrite

574、 jmp rsee

575、 rwrite:

576、 push si

577、 ; mov lct2,si

578、 mov di,0

579、 add si,2

580、 rwrite1:

581、 add si,2

582、 mov ax,number[si]

583、 mov number2[di],ax

584、 cmp ax,7f29h

585、 je rcount

586、 add di,2

587、 jmp rwrite1

588、 rcount:

589、 push si

590、 ; mov lct1,si

591、 call si_ze

592、 pop ax

593、 pop di

594、 push ax

595、 ; mov di,lct2

596、 mov ax,number3

597、 mov number[di],ax

598、 mov number3,0

599、 mov ax,number3[2]

600、 add di,2

601、 mov number[di],ax

602、 mov number3[2],0

603、 pop si

604、 ; mov si,lct1

605、 add si,2

606、 rcount1:

607、 add si,2

608、 add di,2

609、 mov ax,number[si]

610、 mov number[di],ax

611、 cmp ax,7f3dh

612、 je startlp

613、 jmp rcount1

614、

615、 lastl:

616、 mov si,0

617、 lastll:

618、 mov ax,number[si]

619、 mov number2[si],ax

620、 add si,2

621、 cmp ax,7f3dh

622、 je endl

623、 jmp lastll

624、

625、 endl:

626、 call si_ze

627、 ret

628、 loopcount endp

629、 ;**去括号函数结束**

630、 ;==混合四则运算函数==

631、 ;说明: 通过先不处理加减,先把乘除运算进行,将算出的结果带回原来

632、 ; 的地方取代。最终得到一个只有加减的公式。来方便运算

633、 ;特别说明: 本运算还承贷着将(-1)转为ffffh存入number中,既负数输入

634、 si_ze proc near

635、 mov si,4

636、 mov ax,number2

637、 cmp ax,7f2dh;'-'

638、 jne sstart

639、 give number3,number2[4]

640、 mov fhx,1

641、 change number3,fhx

642、 mov fhx,0

643、 jmp end4ze

644、 sstart:

645、 mov ax,number2[si]

646、 cmp ax,7f2ah;'*'

647、 je mull;计算乘法

648、 cmp ax,7f2fh;'/'

649、 je divv

650、 cmp ax,7f3dh;'='

651、 je sznext;去完乘除后跳转

652、 cmp ax,7f29h;')'

653、 je sznext

654、 add si,4

655、 jmp sstart

656、 mull:

657、 sub si,4

658、 give number3,number2[si]

659、 add si,8

660、 give number4,number2[si]

661、 newmul number3,number4

662、 sub si,8

663、 give number2[si],number3

664、 call sloop

665、 jmp sstart

666、 divv:

667、 sub si,4

668、 give number3,number2[si]

669、 add si,8

670、 give number4,number2[si]

671、 newdiv number3,number4

672、 sub si,8

673、 give number2[si],number3

674、 call sloop

675、 jmp sstart

676、 sznext:

677、 give number3,number2

678、 mov si,0

679、 sznext1:

680、 add si,4

681、 mov ax,number2[si]

682、 cmp ax,7f2bh

683、 je addd

684、 cmp ax,7f2dh

685、 je subb

686、 cmp ax,7f3dh

687、 je end4ze

688、 cmp ax,7f29h

689、 je end4ze

690、 jmp sznext1

691、 addd:

692、 add si,4

693、 give number4,number2[si]

694、 newadd number3,number4

695、 jmp sznext1

696、 subb:

697、 add si,4

698、 give number4,number2[si]

699、 newsub number3,number4

700、 jmp sznext1

701、 end4ze:

702、 RET

703、 si_ze endp

704、 sloop proc near;用于循环赋值

705、 mov di,si

706、 add si,8

707、 sloop1:

708、 add di,4

709、 add si,4

710、 mov ax,number2[si]

711、 push ax

712、 give number2[di],number2[si]

713、 pop ax

714、 cmp ax,7f3dh;等号

715、 je endsloop

716、 cmp ax,7f29h;括号

717、 je endsloop

718、 jmp sloop1

719、 endsloop:

720、 ret

721、 sloop endp

722、 ;**混合四则运算结束**

723、 ;==输出函数==;通过除十取余的方法,将数从低位到高位逐一取出再加30h转为

724、 ; ascll输出。注:先判断数的正负来考虑是否输出符号,接着输出

725、 ; 整数部分再输出一个“.”小数点最后输出小数部分

726、 output proc near

727、 mov si,rsi

728、 judge number3,number4

729、 cmp fhx,1

730、 jne output1

731、 mov number0[si],2dh

732、 inc si

733、 mov dx,2dh

734、 mov ah,02h

735、 int 21h

736、 output1:

737、 mov ax,number3

738、 mov bx,10

739、 mov cx,0

740、 call intoutput

741、 mov number0[si],2eh

742、 inc si

743、 mov dx,2eh;输出小数点

744、 mov ah,02h

745、 int 21h

746、 mov ax,number3[2]

747、 mov bx,10

748、 mov cx,0

749、 call intoutput

750、 mov number0[si],'$'

751、 ret

752、 output endp

753、 intoutput proc near

754、 output2:

755、 mov dx,0

756、 div bx

757、 push dx

758、 inc cx

759、 cmp ax,0

760、 je output3

761、 jmp output2

762、 output3:

763、 pop ax

764、 add ax,30h

765、 mov number0[si],al

766、 inc si

767、 mov dx,ax

768、 mov ah,02

769、 int 21h

770、 loop output3

771、 ret

772、 intoutput endp

773、 ;**输出函数**

774、 CRLF PROC NEAR ;回车、显示功能过程定义,属性为NEAR

775、 MOV DL,0DH ;把回车的ASCII码0DH传给DL

776、 MOV AH,02H ;送DOS 的中断调用功能号

777、 INT 21H ; DOS 的中断调用

778、

779、 MOV DL,0AH ; 把换行的ASCII码0AH传给DL

780、 MOV AH,02H ; 送DOS 的中断调用功能号

781、 INT 21H ; DOS 的中断调用

782、 RET ; 返回

783、 CRLF ENDP ;完成过程定义

784、 TIME PROC NEAR ;显示时间子程序

785、 DISPLAY1:MOV SI,0

786、 MOV BX,100

787、 DIV BL

788、 MOV AH,2CH ;取时间

789、 INT 21H

790、 MOV AL,CH

791、 CALL BCDASC ;将时间数值转换成ASCII码字符

792、 INC SI

793、 MOV AL,CL

794、 CALL BCDASC

795、 INC SI

796、 MOV AL,DH

797、 CALL BCDASC

798、 MOV BP,OFFSET DBUFFER

799、 MOV DX,161dH

800、 MOV CX,8

801、 MOV BX,004EH

802、 MOV AX,1301H

803、 INT 10H

804、 MOV AH,02H

805、 MOV DX,0300H

806、 MOV BH,0

807、 INT 10H

808、 MOV BX,0018H

809、 RE: MOV CX,0FFFFH

810、 REA: LOOP REA

811、 DEC BX

812、 JNZ RE

813、 MOV AH,01H

814、 INT 16H

815、 JE DISPLAY1

816、 JMP start3

817、 RET

818、 TIME ENDP

819、 BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序

820、 PUSH BX

821、 CBW

822、 MOV BL,10

823、 DIV BL

824、 ADD AL,'0'

825、 MOV DBUFFER[SI],AL

826、 INC SI

827、 ADD AH,'0'

828、 MOV DBUFFER[SI],AH

829、 INC SI

830、 POP BX

831、 RET

832、 BCDASC ENDP

833、 code ends

834、 end start

835、 在汇编器选项中选择编译文件,编译分为五个阶段,生成一系列文件debug 文件list文件symbol文件和执行文件exe文件

836、 执行编译生成的xiaobocalculator.exe,可以看到如下界面显示的作者的个人信息和执行方法press 'E' key to exit press any key to co

837、Xiaobo Welcome you to use the calculator!

838、 data:2014/4/23

839、 ****Designed by 1wangxiaobo@163.com!****

840、 http://hi.baidu.com/yedeqixian

841、 ^Henan University of Economics and Law^

842、press "E" key to exit

843、press any key to contiune

844、Press "Enter" key to introudction

845、按enter继续操作出现如下第一个界面,再enter出现操作界面,下角有时间显示与系统时间同步

846、在这个界面中输入 4344/2= 按enter就会出现答案如下

847、例43.43*44= 3*(4*(13-9))= 78.432/(4.53*(14-9+4-4-4))=

以上就是关于汇编语言程序这篇文章的一些介绍,希望对大家有所帮助。

免责声明:本文由用户上传,如有侵权请联系删除!