1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 王爽 汇编语言程序课程设计1

王爽 汇编语言程序课程设计1

时间:2021-03-12 05:33:09

相关推荐

王爽 汇编语言程序课程设计1

做这个程序,花了很久时间。回想起来觉得主要原因还是和基础概念有关系。

比如:我一开始的程序里面的SHOW_STR里用MOVSS,AX, 这句话造成我的DEBUG到这一行程序就崩溃了。

这就造成我没办法DEBUG,只能试着替换一些可疑的地方, 然后直接编译运行来验证结果。

MOVSS,AX改成

DS入栈

MOVDS,AX,

...

DS出栈

就没有DEBUG问题了。看了网上解释是说DEBUG也需要用SS,所以会有这种问题。

还有就是进出子程序时,我觉得可以将所有的REGISTER入栈和出栈来保存栈内的值,这样比较容易也轻松很多。但是程序会稍微面一些,因为会将一些子程序没用到的REGISTER

入栈和出栈。

下面就是我的代码:

assume ds:data, es:table, cs:code

data segment db '1975', '1976', '1977', '1978', '1979', '1980', '1981', '1982' db '1983' ,'1984', '1985', '1986', '1987', '1988', '1989', '1990' db '1991', '1992', '1993', '1994', '1995' ; 4bytes per yeardd 16, 22, 382, 1356, 2390, 8000, 16000, 24486 ;4 bytes per numberdd50065, 97479, 140417, 197514, 345980, 590827, 803530, 1183000 dd 1843000, 2759000, 3753000, 4649000, 5937000 dd 3, 7, 9, 13, 28, 38, 130, 220dd 476, 778, 1001, 1442, 2258, 2793, 4037, 5635 dd 8226, 11542, 14430, 15257, 17800 data ends table segment ;db 'year summ n1 ?? ' ;db 'year summ n2 ?? ' ;db 19 dup ('year summ ne ?? ') db 'Year' ; Year 4 digits [0-3]dw 0 ; amont L [4-5] dw 0 ; amont H[6-7]dw 0 ; people count [8-9] dw 0 ; averge[10-11]dw 0 ; filler[12-13]dw 0 ; filler[14-15];[16-17],[18-19],[20-21],[22-23],[24-25],[26-27],[28-29],[30-31] dw 00,317ah,0000h,000Ah,0008h,0008h,0008h,0008h;[32],[33],[34],[35],[36],[37],[38],[39],[40],[41],[42],[43],[44],[45],[46],[47]db 16 dup (0) ;decimal output buffer;[48 - 55]db 8 dup (' ') ;year;[56 - 71]db 16 dup (' ') ;total amount;[72 - 87] db 16 dup (' ') ;Peope count;[88 - 103]db 16 dup (' ') ;average count;[104 - 107]dw 00,00 ;function movCol parameters, 104 is source position, 106 is output position;[108]dw 00 ;data segment pointer value, can be 0, 1;[110]db 00 ;Display buffer pointer valuetable endscode segmentstart: mov ax, datamov ds, ax mov ax, table mov es, ax;*********************使用LOOP 开始mov cx, 21 mov es:[110], 0b800h mov si, 0mov ax, 0shwNYr:mov bx, es:[110]add bx, 0Ahmov es:[110], bx mov es:[108], ax ; mov 0 to year data pointer add ax, 4Call shwYear loop shwNYr ;;*********************使用LOOP 结束;*********************使用21次硬编码 开始 ; mov es:[110], 0b800h ;0 ;1975; mov ax, 0; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b80Ah ;1 ;1976; mov ax, 4; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b814h ;2 ;1977; mov ax, 8; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b81Eh ;3 ;1978; mov ax, 12; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b828h ;4 ;1979; mov ax, 16; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b832h ;@60 5 ;1980; mov ax, 20; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b83Ch ;@71 6 ;1981; mov ax, 24; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b846h ;7 ;1982; mov ax, 28; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b850h ;8 ;1983; mov ax, 32; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b85Ah ;9 ;1984; mov ax, 36; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b864h ; 10 ;1985; mov ax, 40; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b86Eh ; 11 ;1986; mov ax, 44; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b878h ; 12 1987; mov ax, 48; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b882h ; 13 1988; mov ax, 52; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b88Ch ; 14 1989; mov ax, 56; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b896h ; 15 1990; mov ax, 60; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b8A0h ; 16 1991; mov ax, 64; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b8AAh ; 17; mov ax, 68 ; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b8B4h ; 18; mov ax, 72; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b8BEh ; 19; mov ax, 76; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b8C8h ;20; mov ax, 80; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear ; mov es:[110], 0b8D2h ; 21; mov ax, 84; mov es:[108], ax ; mov 0 to year data pointer; Call shwYear;*********************使用21次硬编码 结束mov ax, 4c00hint 21h;***********************************************************;******Show One Year's informshwYear:push ax push bx push cx push dx ;push sp push bp push si push dimov si, es:[108];year off set;mov ax, es:[si];year off set;put year at line 18 db 'Year' ; Year 4 digitsmov ax, ds:[si];ds:[0]mov es:[0], axmov ax, ds:[si+2] ;ds:[2]mov es:[2], ax;put amount;off set 21 year, 21 * 4= 84bytesmov ax, ds:[si+84] ;ds:[84] ;ds:[84] = 16mov es:[4], axmov ax, ds:[si+86] ;ds:[86] ;ds:mov es:[6], ax;put people count;off set 21 numbers, 21 * 4= 84bytesmov ax, ds:[si+168] ; ds:[168]mov es:[8], ax;Now I got '31 39 37 35 10 00 00 00-03 00 00 00 00 00 00 00';push bpCall divDW ;Compile Line @2D;pop bp;D 1966:0 f should be;'31 39 37 35 10 00 00 00-03 00 00 00 05 00 00 00' ;*********************** Move Year ************************mov ax, es:[0] ;Line 47 in exemov es:[48], ax mov ax, es:[2] mov es:[48+2], ax ;D 1966:30 3f should be;'31 39 37 35 20 20 20 20-20 20 20 20 20 20 20 20';*********************** Move Total Amount ************************ mov ax, 4mov es:[104], axmov ax, 56mov es:[106], ax;push bpCall MovCol ;@5E ;pop bp;D 1966:30 3f should be;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20' ;push bpCALL clnBuf;pop bp;*********************** Move People Amount ************************ mov ax, 8mov es:[104], axmov ax, 72mov es:[106], ax;push bpCall MovCol ;@81 ;pop bp;D 1966:30 4f;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20';'20 20 20 20 20 20 20 20-33 20 20 20 20 20 20 20' ;push bpCALL clnBuf;pop bp;********************** Move average ***********************mov ax, 12mov es:[104], axmov ax, 88mov es:[106], ax;push bpCall MovCol ;@81 ;pop bp;D 1966:30 4f;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20';'20 20 20 20 20 20 20 20-33 20 20 20 20 20 20 20' ;push bpCALL clnBuf ;pop bp ;mov string terminatormov cx, 0 ;@11Bmov es:[93], cx;D 1966:30 5f;'31 39 37 35 20 20 20 20-31 36 20 20 20 20 20 20';'20 20 20 20 20 20 20 20-33 20 20 20 20 20 20 20' ;'20 20 20 20 20 20 20 20-35 20 20 20 20 20 20 00' MOV ax, es:[110] ;0b800h;push bpCall Show_str ;@123 ;pop bppop di pop si pop bp ;pop sppop dx pop cx pop bx pop axret;***********************************************************;******Move ColumnmovCol:;pop bp push ax push bx push cx push dx ;push sppush bp push si push dimov si, es:[104]mov ax, es:[si]mov es:[18], ax ; 4240 Divident(L)mov ax, es:[si+2]mov es:[20], ax ; 000f Divident(H)mov si, 46 push bpCall ToAsc ;@11Cpop bpmov cx, 8mov bx, 0 mov si, 0movAsc4: PUSH cxmov cx, es:[31+si]ADD si, 2jcxz skpEmp4 mov ax, table mov es, axpush simov si, es:[106]mov es:[si+bx], chpop siADD bx, 1skpEmp4:pop cx loop movAsc4 ;pop di pop si pop bp ;pop sppop dx pop cx pop bx pop ax;push bp ;@147ret;***********************************************************;******Show Textshow_str:;pop bp ;@F6push ax push bx push cx push dx ;push sppush bp push si push dipush ss push ds;mov ax, 0b86ehmov ax, es:[110]mov ds, ax ;rowmov si, 08 ;Column, control left or right on screenmov bx, 0 ;String stard postionmov ah, 00000010B ;Font main: mov cl, es:[bx+48] ; ds:[bx] is the character @109mov al, ' 'mov es:[bx+48], al ; reset the ascii to emptymov al, cl mov ch, 0jcxz EXIT_SS;@110mov ds:[si], ax ; this ss:[si+bx] is character position inc bx add si, 2jmp short main;@119EXIT_SS:pop dspop ss pop di pop si pop bp ;pop sppop dx pop cx pop bx pop axret ;*******************divDW************************;| | | | | | | |;0 4 6 8 10 12 14;0 - year;4 - revenue LOW;6 - revennue HIGH;8 - People;10 - Average;12 - Not in use;14 - Not in use;For example input is;31 39 37 35 10 00 00 00-03 00 00 00 00 00 00 00';then output should be;31 39 37 35 10 00 00 00-03 00 00 00 05 00 00 00'; db 'Year' ; Year 4 digits [0-3]; dw 0 ; amont L [4-5] ; dw 0 ; amont H[6-7]; dw 0 ; people count [8-9] ; dw 4 ; averge[10-11]; dw 4 ; filler[12-13]; dw 4 ; filler[14-15]divDW: ;chapter: 8.7 Page 157 push ax push bx push cx push dx ;push sppush bp push si push di MOV BX, es:[4] ;4240 Divident(L) ;Compile Line 5E @FDMOV AX ,es:[6] ; 000f Divident(H)MOV CX ,es:[8] ; 000A DivisorMOV DX, 0 DIV CX ; (DX(0) + AX(000f)) / CXmov es:[14], axMOV AX, BX ; move Divident (L) in AXDIV CX ; (DX(0005) + AX (4240)) / CXmov es:[12], ax ;mov es:[0], dxpop di pop si pop bp ;pop sppop dx pop cx pop bx pop axret ;@11D;*******************To Ascii************************;| | | | | | | |;0 2 4 6 8 10 12 14;0 - remainder;2 - Divident LOW;4 - Divident HIGH;6 - TEN;8 - NOT IN USE;dw 00,4240h,000fh,000Ah,0008h,0008h,0008h,0008h;PUT the output to 32-47 position;ToAsc: ;chapter: 8.7 Page 157 @1A8push ax push bx push cx push dx ;push sppush bp push si push diToAsc_m:MOV BX, es:[18] ; 4240 Divident(L) MOV AX ,es:[20] ; 000f Divident(H)MOV CX ,es:[22] ; 000A DivisorMOV DX, 0 ;@12EDIV CX ; (DX(0) + AX(000f)) / CXmov es:[20], axMOV AX, BX ; move Divident (L) in AXDIV CX ; (DX(0005) + AX (4240)) / CXmov es:[18], ax mov es:[16], dxmov cx, es:[16] ; set remaider in cxadd cx, 30h ; add decimal ascii mov es:[si], cxSUB si, 2mov ax, es:[18] ; using bit OR to merge Divident H to Divident LowOR ax, es:[20] ; Divident H is ds:[4], Divident L is ds:[2]MOV cx, ax ; Then check whether ds:[2] is 0 or notjcxz EXIT_TA ;exit_toAsicc ;@1E7jmp ToAsc_mEXIT_TA: pop di pop si pop bp ;pop sppop dx pop cx pop bx pop axret;***********************************************************;******clean bufferclnbuf: push ax push bx push cx push dx ;push sppush bp push si push dimov cx, 8 ;@61mov bx, 0 reset: MOV ax, 0mov es:[32+bx], axADD bx, 2 loop reset pop di pop si pop bp ;pop sppop dx pop cx pop bx pop axretcode endsend start

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。