8086汇编计算分段函数值

  题目(题目链接:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3735043.html):计算给定分段函数在不同输入时的取值。

  要求:编制程序,计算下面函数值:

 

 

  其中,从键盘输入x与y,输出数据为a。

  输入输出时候都要求有提示信息。

  考查知识点:分支结构的应用。

  环境:

  操作系统:Windows 10 Pro N for Workstation

  模拟器:DosBox 0.74

  编译器:masm 5.0

  链接器:link 3.6

  实现:

  8086汇编语言

  结果如下所示:

编译程序

 

链接程序

 

 

 

 

  源码如下所示:

 

  1 stack   segment stack
  2         db 512 dup(?)
  3 stack   ends
  4     
  5 data    segment
  6         input1 db "input x(-32768~32767):", 0ah, 0dh, '$'
  7         input2 db "input y(-32768~32767):", 0ah, 0dh, '$'
  8         input3 db "x = ", '$'
  9         input4 db "y = ", '$'
 10         input5 db "a = ", '$'
 11         x dw 0
 12         y dw 0
 13         a dw 0
 14 data    ends
 15     
 16 code     segment
 17         assume ds: data, cs: code, ss: stack
 18 main:    
 19 
 20         mov ax, data
 21         mov ds, ax
 22         mov ax, stack
 23         mov ss, ax
 24     
 25         lea dx, input1
 26         mov ah, 09h
 27         int 21h
 28     
 29         ;readsiw 输入有符号十进制整数 (-32768~32767) 出口:AX=16位数据
 30         call readsiw
 31         mov [x], ax
 32         ;int 3        ;这句话有什么用?
 33     
 34     
 35         lea dx, input2
 36         mov ah, 09h
 37         int 21h
 38         
 39         call readsiw
 40         mov [y], ax
 41         
 42         lea dx, input3
 43         mov ah, 09h
 44         int 21h
 45     
 46         ;dispsiw 显示有符号十进制数据 入口:AX=16位数据
 47         mov ax, [x]
 48         call dispsiw
 49         call lineFeed
 50     
 51     
 52         lea dx, input4
 53         mov ah, 09h
 54         int 21h
 55     
 56         mov ax, [y]
 57         call dispsiw
 58         call lineFeed
 59         
 60         lea dx, input5
 61         mov ah, 09h
 62         int 21h
 63     
 64         mov ax, [x]        ;ax <- [x]
 65         cmp ax, 0
 66         jge x_bigger_0    ;x >= 0
 67         jmp x_smaller_0
 68 
 69 x_bigger_0:
 70         mov bx, [y]        ;bx <- [y]
 71         cmp bx, 0        
 72         jnge opposite_Sign    ;case 2: x >= 0 and y < 0, so x and y are opposite sign 
 73         mov ax, 1            ;case 1: x >= 0 and y >= 0
 74         call dispsiw        ;output 1
 75         ;mov [a], ax
 76         ;call lineFeed
 77         jmp done
 78 
 79 x_smaller_0:
 80         mov bx, [y]        ;bx <- [y]
 81         cmp bx, 0        
 82         jg     opposite_Sign            ;case 3: x < 0 and y >= 0        
 83         mov ax, -1        ;case 4 :x < 0 and y < 0
 84         call dispsiw    ;output -1
 85         mov [a], ax
 86         ;call lineFeed
 87         jmp done
 88             
 89 opposite_Sign:
 90         mov ax, 0
 91         call dispsiw    ;output 0
 92         mov [a], ax
 93         ;call lineFeed
 94         jmp done
 95 
 96 done:    
 97         mov ah, 4ch
 98         int 21h
 99     
100 readsiw proc
101         push bx
102         push cx
103         push dx
104         xor bx, bx   ;BX保存结果
105         xor cx, cx   ;CX为正负标志,0为正,-1为负
106         mov ah, 1
107         int 21h
108         cmp al, '+'
109         jz rsiw1
110         cmp al, '-'
111         jnz rsiw2
112         mov cx, -1
113 rsiw1: 
114         mov ah,  1
115         int 21h
116 rsiw2:    
117         cmp al, '0'
118         jb rsiw3
119         cmp al, '9'
120         ja rsiw3
121         sub al, 30h
122         xor ah, ah
123         shl bx, 1
124         mov dx, bx
125         shl bx, 1
126         shl bx, 1
127         add bx, dx
128         add bx, ax
129         jmp rsiw1
130 rsiw3:
131         cmp cx, 0
132         jz rsiw4
133         neg bx
134 rsiw4:
135         mov ax, bx
136         pop dx
137         pop cx
138         pop bx
139         ret
140 readsiw endp
141 
142 dispsiw proc
143         push ax
144         push bx
145         push dx
146         test ax, ax ;判断数据是零、正数或负数
147         jnz dsiw1
148         mov dl, '0' ;是零,显示“0”后退出
149         mov ah, 2
150         int 21h
151         jmp dsiw5
152 dsiw1:
153         jns dsiw2  ;是负数,显示“-”
154         mov bx, ax
155         mov dl, '-'
156         mov ah, 2
157         int 21h
158         mov ax, bx
159         neg ax ;数据求补(绝对值)
160 dsiw2:  
161         mov bx, 10
162         push bx ;10压入堆栈,作为退出标志
163 dsiw3:
164         cmp ax, 0
165         jz dsiw4
166         xor dx, dx ;扩展被除数DX.AX
167         div bx  
168         add dl, 30h  ;余数(0~9)转换为ASCII码
169         push dx     ;数据各位先低位后高位压入堆栈
170         jmp dsiw3
171 dsiw4:
172         pop dx
173         cmp dl, 10
174         je dsiw5
175         mov ah, 2
176         int 21h
177         jmp dsiw4
178 dsiw5:
179         pop dx
180         pop bx
181         pop ax
182         ret
183 dispsiw endp
184 
185 lineFeed proc
186         mov dx, 0ah;换行
187         mov ah, 02h
188         int 21h;执行输出
189         ret
190 lineFeed endp
191 
192 code ends
193         end main

 

posted on 2020-06-10 22:03  25th_engineer  阅读(945)  评论(0编辑  收藏  举报