8086汇编计算分段函数值
题目(题目链接:):计算给定分段函数在不同输入时的取值。
要求:编制程序,计算下面函数值:
其中,从键盘输入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