zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【总结+计划】七八月份总结+九月份计划——未知的状态最可怕
    【总结+计划】六月份总结+七月份计划——实习 就业 自学
    【计划】六月自学计划
    【总结】五月份总结——到底前端还是后台好呢
    Android中如何让DialogFragment全屏
    有用的
    Android Studio多渠道打包的使用
    adb not responding的解决方案
    ButterKnife的使用
    程序中判断android系统版本
  • 原文地址:https://www.cnblogs.com/25th-engineer/p/13089486.html
Copyright © 2011-2022 走看看