1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
| ; max3.asm
; 获取两个数中较大的数的宏 ; 入口参数: num1, num2 ; 出口参数: AX = max(num1, num2) max2 macro num1, num2 local bigFlag, endFlag push dx mov dx, num1 cmp dx, num2 jnb bigFlag mov ax, num2 jmp endFlag bigFlag: mov ax, dx endFlag: pop dx endm
; 获取三个数中较大的数的宏 ; 入口参数: num1, num2, num3 ; 出口参数: AX = max(num1, num2, num3) max3 macro mnum1, mnum2, mnum3 max2 mnum1, mnum2
max2 ax, mnum3 endm
stack segment stack db 1024 dup(?) stack ends
data segment x dw 0 y dw 0 z dw 0 xMsg db 'enter x:$' yMsg db 'enter y:$' zMsg db 'enter z:$' rMsg db 'the bigest num is $' xStr db 20, ?, 20 dup('$') yStr db 20, ?, 20 dup('$') zStr db 20, ?, 20 dup('$') result db 20 dup('$') data ends
code segment 'code' assume cs:code, ds:data, ss:stack start: ; init segment register mov ax, data mov ds, ax
; 提示输入 x lea dx, xMsg mov ah, 09H int 21H call newLine
; 读取 x lea dx, xStr mov ah, 0aH int 21H call newLine
; 提示输入 y lea dx, yMsg mov ah, 09H int 21H call newLine
; 读取 y lea dx, yStr mov ah, 0aH int 21H call newLine
; 提示输入 z lea dx, zMsg mov ah, 09H int 21H call newLine
; 读取 z lea dx, zStr mov ah, 0aH int 21H call newLine
; 转换 xStr lea ax, xStr adc ax, 02H ; 获取字符串首地址 push ax xor ax, ax mov al, xStr[1] ; 获取字符串位数 push ax call far ptr strToNumber add sp, 4 ; 平衡堆栈 mov x, ax
; 转换 yStr lea ax, yStr adc ax, 02H ; 获取字符串首地址 push ax xor ax, ax mov al, yStr[1] ; 获取字符串位数 push ax call far ptr strToNumber add sp, 4 ; 平衡堆栈 mov y, ax
; 转换 zStr lea ax, zStr adc ax, 02H ; 获取字符串首地址 push ax xor ax, ax mov al, zStr[1] ; 获取字符串位数 push ax call far ptr strToNumber add sp, 4 ; 平衡堆栈 mov z, ax
max3 x, y, z
; 将结果转换为字符串 push ax lea ax, result push ax call far ptr numberToStr add sp, 4 ; 平衡堆栈
; 显示结果提示信息 lea dx, rMsg mov ah, 09H int 21H
; 显示结果 lea dx, result mov ah, 09H int 21H
; Exit mov ax, 4c00H int 21H
; 字符串转数值的通用过程 ; 入口参数:调用前按顺序压入字符串首地址,字符个数 ; 出口参数:转换结果保存在 AX 中 strToNumber proc far push bp mov bp, sp
push bx push cx push dx push si ; ax 不需要压入
mov cx, [bp + 6] ; 字符个数 mov si, [bp + 8] ; 字符串首地址 mov ch, 0 ; dec cl
; 打印该字符串 ; mov dx, si ; mov ah, 09H ; int 21H ; call newLine
; 显示字符串位数 ; mov dl, cl ; mov ah, 02H ; adc dl, '0' ; int 21H ; call newLine
xor ax, ax ; 将 ax 清零,用于保存转换结果 xor dx, dx ; dx 用于暂存每一位字符 xor bx, bx ; bx 用于存放乘数 10 mov bl, 0aH
convertNum: mul bx ; 将 ax 乘以 10 mov dl, [si] sub dl, '0' ; dh 为 0 add ax, dx inc si loop convertNum
pop si pop dx pop cx pop bx pop bp ret strToNumber endp
; 将数值转换为字符串的通用方法 ; 入口参数: 按顺序压入数值、目的字符串首地址 ; 出口参数: 无 numberToStr proc far push bp mov bp, sp
push ax push bx push cx push dx push si
mov ax, [bp + 8] ; 取出数值 mov si, [bp + 6] ; 取出目的地址 mov bx, 0aH ; 用于保存 10
mov dx, ax ; 保存 ax xor cx, cx ; 用于保存字符串的长度 getLength: inc cx div bl xor ah, ah cmp ax, 0 jnz getLength
mov ax, dx ; 恢复ax
dec cx add si, cx ; 将 si 指向字符串的末尾
convertStr: xor dx, dx div bx ; dx.ax / bx 余数在 dx, 商在 ax add dx, '0' mov [si], dl dec si cmp ax, 0 jnz convertStr pop si pop dx pop cx pop bx pop ax pop bp ret numberToStr endp
; 换行的通用过程 newLine proc push ax push dx
mov ah, 02H mov dl, 0dH int 21H mov ah, 02H mov dl, 0aH int 21H
pop dx pop ax ret newLine endp
code ends end start
|