格式: MUL OPRD
功能: 乘法操作(注意 只有一个操作数)
OPRD为源操作数,即作乘数.目的操作数是隐含的,即被乘数总是指定为累加器AX 或AL的内容。
rkmain proc
mov ax,5
mov bx,2
mul bx ;实际上干的事情是ax*bx,结果在ax里。
mov ax,4c00h
int 21h
rkmain endp
格式: DIV OPRD
功能: 实现两个无符号二进制数除法运算.
DIV CX 商在AX中,余数在DX中
DIV BL 商在AL中,作数在AH中
assume cs:code,ds:data
data segment
data ends
code segment
rkmain proc
mov ax,16
mov bx,5
div bx ;实际上干的事情是ax/bx,结果在ax里。
mov ax,4c00h
int 21h
rkmain endp
start:call rkmain
code ends
end start
格式: XOR OPRD1 OPRD2
功能: 实现两个操作数按位‘异或’运算,结果送至目的操作数中。
格式: AND OPRD1 OPRD2
功能: 对两个操作数实现按位逻辑与运算,结果送至目的操作数.本指令可以进行字节或字
---- 的‘与’运算,OPRD1<–OPRD1 and OPRD2.
格式: NOT OPRD
功能: 完成对操作数按位求反运算(即0变1,1变0),结果关回原操作数。
RkPrint proc ; 打印功能
push ax ;保存ax值
mov ah,9h ;9号中断
int 21h
pop ax ;恢复
ret
RkPrint endp
RkExit Proc ;退出封装
mov ax,4c00Hm
mov ds,ax
RkExit endp
RkScanf proc
push ax
push bx
push cx
push dx
pop dx
pop cx
pop bx
pop ax
ret
RkScanf endp
0D-回车 0A-换行
RkEnter proc
push ax
push dx
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah
mov ah,02h
pop dx
pop ax
ret
RkEnter endp
16位汇编接收到的都是ASCII码
我们需要自己把ASCII码转换成数字
(我没有找到这个转换的函数但是貌似是不太需要去掌握的内容)如果找到了请放在代码段里= =
DUP是重要数据定义操作符,利用带DUP的表达式可以为若干重复数据分配存储单元 ,并赋予相应的变量名。带DUP的表达式格式如下:
<n> DUP<(表达式)>
其中圆括号内的表达式是重复的内容,n是重复次数。
TAB1 DB 10H DUP(?)
assume cs:code,ds:data
mlength = 6 ;定义全局量
data segment
bufferNum1 db mlength;创建一个char
db ? ;db的数据宽度为8 问号意思为不定长
db mlength dup(0),'$' ;终止
bufferNum2 db mlength;创建一个char
db ? ;db的数据宽度为8 问号意思为不定长
db mlength dup(0),'$' ;终止
add ret
data ends
num1 dw ? ;长度为dw
num2 dw ?
buffer1 db 0DH,0AH,'input number1:$';进行一个输入的提示
buffer2 db 0DH,0AH,'input number1:$'
buffer3 db 0DH,0AH,'input (+-*/):$'
code segment
;此处缺少一串ASCII码转数字的函数
InitDataSegment proc ;初始化数据段
mov ax,data
mov ds,ax
ret
InitDataSegment endp
RkExit Proc ;退出封装
mov ax,4c00Hm
mov ds,ax
RkExit endp
RkPrint proc ; 打印功能
push ax ;保存ax值
mov ah,9h ;9号中断
int 21h
pop ax ;恢复
ret
RkPrint endp
RkScanf proc
push ax
push bx
push cx
push dx
mov ah,0AH
pop dx
pop cx
pop bx
pop ax
ret
RkScanf endp
RkEnter proc
push ax
push dx
mov dl,0dh
mov ah,02h
int 21h
mov dl,0ah ;dl输出字符
mov ah,02h
pop dx
pop ax
ret
RkEnter endp
rkmain proc
call InitDataSegment ;初始数据段 (加法计算器)
mov dx,offset buffer1 ;打印字符串 地址打印到dx里 把buffer1给取出来
call RkPrint ;直接call一下已经封装好的打印函数
mov dx,offset bufferNum1
call Rkscanf ;将得到的数据放到buffer里面
call RkEnter
mov bx,offset bufferNum
call AsciiToNumber ;调用ASCII码转数字函数(缺失)
mov num1,ax ; num1就成为了输入的数字
mov dx,offset buffer2 ;打印字符串 地址打印到dx里 把buffer2给取出来
call RkPrint ;直接call一下已经封装好的打印函数
mov dx,offset bufferNum1+1
call Rkscanf ;将得到的数据放到buffer里面
call RkEnter
mov bx,offset bufferNum2+1
call AsciiToNumber ;调用ASCII码转数字函数(缺失)
mov num2,ax ; num2就成为了输入的数字
;现在已经接收了俩数,差运算符。
mov dx,offset buffer3 ;打印字符串 地址打印到dx里 把buffer3给取出来
call RkPrint ;
mov ah,07h
int 21h
call RkEnter
cmp al,2bh
je addflag ;如果相等
jmp exitcode
addflag:
mov ax,[num1]
add ax,[num2]
mov bx,offset add_yet
call NumberToAscii ;(缺失)
mov dx,offset add_yet
call RkPrint
call RkEnter
exitcode:
call RkEnter
call RkExit
rkmain endp
start:call rkmain
code ends
end start