【汇编语言学习笔记】第六讲.运算指令

第六讲.运算指令

1.无符号数乘法指令 MUL

格式: 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

2.无符号数除法指令 DIV

格式: 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

3.逻辑异或运算指令 XOR

格式: XOR OPRD1 OPRD2

功能: 实现两个操作数按位‘异或’运算,结果送至目的操作数中。

4.逻辑与运算指令 AND

格式: AND OPRD1 OPRD2

功能: 对两个操作数实现按位逻辑与运算,结果送至目的操作数.本指令可以进行字节或字
---- 的‘与’运算,OPRD1<–OPRD1 and OPRD2.

5.逻辑非运算指令 NOT

格式: NOT OPRD

功能: 完成对操作数按位求反运算(即0变1,1变0),结果关回原操作数。

6.一些功能的封装

①打印功能
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
④回车换行功能(\n)

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

你可能感兴趣的:(汇编语言学习笔记,学习,汇编语言,安全,开发语言)