• 带括号的四则运算 汇编


      1 ;作者:HelloMsg
    2 ;网址:http://www.cnblogs.com/wbb2109/
    3 ;邮箱:hellomsg_noreply@163.com
    4 ;时间:2011.11.26
    5 ;带括号的四则运算
    6 ;算法:1.将键盘输入的计算式(中缀式)存入array1中sub8;
    7 ; 2.将中缀式转换为后缀式存入array2中,算法思想:
    8 ; 从左至右逐字(word)读取array1中的内容:
    9 ; a.当当前字符为数字时,直接输出到array2;
    10 ; b.当当前字符为"("时,将其压栈;
    11 ; c.当当前字符为")"时,则弹出堆栈中最上的"("之前的所
    12 ; 有运算符并输出到array2,然后删除堆栈中的"(" ;
    13 ; d.当当前字符为运算符时,则依次弹出堆栈中优先级大于
    14 ; 等于当前运算符的,存入array2.再将当前运算符压栈
    15 ; c.当为"="时,弹出所有栈中的内容存入array2.
    16 ; 3.建立一个栈,然后从左至右扫描array2,每遇到操作数
    17 ; 就压入栈中,每遇到运算符号,就弹出栈顶的操作数,
    18 ; 完成相应的操作并把结果再压入栈中。最后的结果将保
    19 ; 留在栈顶。
    20 ; 4.输出结果
    21 ;提示:该程序只对输入操作数小于65280,每步运算结果小于65535的
    22 ; 计算式有效。并且都是正整数。
    23
    24 assume cs:code,ds:data,ss:stack
    25 data segment
    26 array1 dw 100 dup(0) ;存放中缀表达式
    27 array2 dw 100 dup(0) ;存放后缀表达式
    28 ;operator '(','=','+','-','*','/',作者约定优先级别为0,0,1,1,2,2
    29
    30 data ends
    31
    32 stack segment
    33 dw 100 dup(0)
    34 stack ends
    35
    36 code segment
    37 main proc far
    38 mov ax,data
    39 mov ds,ax
    40 mov ax,stack
    41 mov ss,ax
    42 mov sp,200
    43
    44
    45 call sub8
    46 call sub9
    47 call sub10
    48
    49 call sub11
    50 mov ah,0
    51 int 16h
    52 main endp
    53 ;使运算符高八位为0ffh,以区别内存中的操作数和运算符。
    54 ;这就是为什么规定输入的操作数要小于65280 。
    55 sub8 proc near ;将计算式按中缀式存入array1中
    56 push ax
    57 push bx
    58 push dx
    59 lea di,array1
    60 xor cx,cx
    61 aa2: mov ah,1
    62 int 21h
    63
    64
    65 cmp al,30h ;判断若小于48,则为运算符
    66
    67 jc aa5
    68
    69
    70 cmp al,3ah ;判断若大于57,则为等于号
    71 jnc aa1
    72 add cx,cx ;否则为0~9,将其由ascii转换为数值
    73 mov bx,cx
    74 add cx,cx
    75 add cx,cx
    76 add cx,bx
    77 and ax,0fh
    78 add cx,ax
    79
    80 jmp aa2
    81 aa3: mov [di],cx
    82 inc di
    83 inc di
    84 mov cx,0 ;将数值存入内存,并cx赋0,标记其以存入内存
    85
    86 aa4: mov ah,0ffh ;通过高8位区别数字还是运算符
    87 mov [di],ax
    88 inc di
    89 inc di
    90 jmp aa2
    91 aa5: cmp cx,0 ;判断前面输入的是不是数字
    92 jz aa4
    93 jmp aa3
    94 aa6: mov [di],cx
    95 inc di
    96 inc di
    97 mov cx,0
    98 aa1: cmp cx,0 ;判断若在输入等号的前一位是数值
    99 jnz aa6 ;则存入内存
    100 mov ah,0ffh
    101 mov [di],ax
    102 pop dx
    103 pop bx
    104 pop ax
    105 ret ;返主
    106 sub8 endp
    107
    108
    109 sub9 proc near ;中缀式转后缀式,存入array2
    110 sub cx,cx
    111 push ax
    112 push bx
    113 push dx
    114 mov ax,'='
    115 mov ah,0ffh
    116 push ax
    117 inc cx
    118 lea di,array1
    119 lea si,array2
    120
    121
    122 bb1: mov ax,[di]
    123 inc di
    124 inc di
    125 cmp ah,0ffh ;小于0ffh就为数字
    126 jnc bb2 ;大于0ffh就为运算符
    127 mov [si],ax
    128 inc si
    129 inc si
    130 bb3: jmp bb1
    131 bb2: cmp al,'('
    132 jz bb4 ;若为“(”,则压入栈
    133 cmp al,')' ;若为“)”,则弹出栈中最上的
    134 jz bb5 ;'('之前的所有运算符并输出到array2
    135 cmp al,'=' ;若为“=”,则弹出栈中的所有
    136 jz bb6
    137 bb11:mov bp,sp
    138 cmp al,'+'
    139 jz bb7
    140 cmp al,'-'
    141 jz bb7
    142 cmp al,'*'
    143 jz bb9
    144 cmp al,'/'
    145 jz bb9
    146 bb4: push ax
    147 inc cx
    148 jmp bb1
    149
    150 bb5: pop ax
    151 dec cx
    152 cmp al,'('
    153 jz bb1
    154 ;cmp al,'='
    155 ; jz bb6
    156 mov [si],ax
    157 inc si
    158 inc si
    159 jmp bb5
    160
    161
    162 bb7: cmp byte ptr [bp],'+'
    163 jz bb12
    164 bb8: cmp byte ptr [bp],'-'
    165 jz bb12
    166 bb9: cmp byte ptr [bp],'*'
    167 jz bb12
    168 bb10:cmp byte ptr [bp],'/'
    169 jz bb12
    170 jmp bb4
    171
    172 bb12: pop bx
    173 dec cx
    174 mov [si],bx
    175 inc si
    176 inc si
    177 jmp bb11
    178
    179 bb6: pop ax
    180 mov [si],ax
    181 inc si
    182 inc si
    183 loop bb6
    184 pop dx
    185 pop bx
    186 pop ax
    187 ret
    188 sub9 endp
    189 sub10 proc near
    190 push ax
    191 push bx
    192 push dx
    193
    194 lea si,array2
    195 pp1:mov ax,[si]
    196 inc si
    197 inc si
    198 cmp ah,0ffh
    199 jz pp2
    200 push ax
    201 jmp pp1
    202 pp2:cmp al,'='
    203 jz pp7
    204 pop bx
    205 pop dx
    206 cmp al,'+'
    207 jz pp3
    208 cmp al,'-'
    209 jz pp4
    210 cmp al,'*'
    211 jz pp5
    212 cmp al,'/'
    213 jz pp6
    214
    215
    216 pp3:add dx,bx
    217 push dx
    218 jmp pp1
    219 pp4:sub dx,bx
    220 push dx
    221 jmp pp1
    222 pp5:mov ax,dx
    223 mul bx
    224 push ax ;用的是16位乘法,高位放在dx里,
    225 jmp pp1 ;低位放在ax里,这里约定结果小于65535
    226 pp6:mov ax,dx
    227 mov dx,0 ;因为16位(除数)除法,则高16位默认在dx里,
    228 ;所以要将dx置零
    229 div bx ;ax存商,dx存 余数
    230 push ax
    231 jmp pp1
    232 pp7:pop cx
    233 pop dx
    234 pop bx
    235 pop ax
    236 ret ;返主
    237 sub10 endp
    238 sub11 proc near ;将结果以十进制形式输出到屏幕
    239 push ax
    240 push bx
    241 push dx
    242 cmp cx,10000
    243 jnc a12
    244 cmp cx,1000
    245 jnc a4
    246 cmp cx,100
    247 jnc a6
    248 cmp cx,10
    249 jnc a8
    250 jmp a10
    251 a12:mov dl,-1
    252 a3: sub cx,10000
    253 inc dl
    254 jnc a3
    255 add cx,10000
    256 or dl,30h
    257 mov ah,2
    258 int 21h
    259 a4: mov dl,-1
    260 a5: sub cx,1000
    261 inc dl
    262 jnc a5
    263 add cx,1000
    264 or dl,30h
    265 mov ah,2
    266 int 21h
    267 a6: mov dl,-1
    268 a7: sub cx,100
    269 inc dl
    270 jnc a7
    271 add cx,100
    272 or dl,30h
    273 mov ah,2
    274 int 21h
    275 a8: mov dl,-1
    276 a9: sub cx,10
    277 inc dl
    278 jnc a9
    279 add cx,10
    280 or dl,30h
    281 mov ah,2
    282 int 21h
    283 a10:mov dl,cl
    284 or dl,30h
    285 mov ah,2
    286 int 21h
    287 pop dx
    288 pop bx
    289 pop ax
    290 ret ;返主
    291 sub11 endp
    292
    293 code ends
    294 end main


  • 相关阅读:
    记RestTemplate远程请求接口数据的一些注意事项
    记使用SpringDataMongonDb时,dao方法命名的一个已解决但不知道为什么的bug
    charles 打断点后传参或返回数据更改
    在liunx上搭建git仓库1
    jsonpath 提取参数
    pytest 参数化的使用1
    pytest中断言失败后,也可以继续执行其他用例
    charles开启弱网功能
    httprunner 参数化
    httprunner中debugtalk使用
  • 原文地址:https://www.cnblogs.com/wbb2109/p/Assembly.html
Copyright © 2020-2023  润新知