第5/6 汇编伪指令及程序设计(Pro)

目录

考点1        标号和变量的命名和用法

考点2        伪指令的类型和功能

(1)段定义

 (2)数据定义:

考点3        DOS功能调用的应用

考点4        汇编语言程序编程

        例1:编程实现求S=(X2+Y2)/z的值,并将结果放入RESULT单元。DATA SEGMENTX DB 2Y DB9Z DB 6RESULT DB?DATA ENDS

考点5        子程序的相关知

考点6        汇编A程序上机过程     

.asm

.obj

.exe           

        总结   


考点1        标号和变量的命名和用法

        1.定义

                  变量:存储单元中数据的地址

                                        Str 内存单元的首地址

               变量名:在程序运行中随时可以通过变量名访问内存

                                         ;变量名    内容

        变量的三个属性:段属性、偏移属性、类型{DB,DW,DD}属性

                                        地址

        变量名伪指令 表达式1,表达式2,

        标号:存储单元中指令的地址

                是指令性语句存放在丙存的地址的符号表示

                常用于指令的转移和子程序调用。

标号有三个属性:

                        段地址、偏移地址和类型(NEAR、 FAR)。

标号使用格式:

                        标号:指令语句

2.命名规则由字母

        (大/小写):数字及特殊符号(_$?@%)组成,

        第一个字符不能是数字

        一个源程序中,用户定义的标示符必须

        合法: abc, HAO,_100, %123, x_1,

        不合法: #123,*100, 2019Y,1_2, ADD, BX

                        (保留字不能用)

  汇编语言基础标识符由长度不超过31个字符的字符串组成。

考点2        伪指令的类型和功能

        在汇编过程中不产生指令码,只用来表示汇编程序如何汇编的指令是()。
        A. 汇编指令

        B.机器指令

        c. 伪指令

        D. 宏指令

(1)段定义

                                        {一个完整的汇编程序都要有段

                                       cpu内部        DS,CS,SS,ES 保存的内存单元的首地址

                                          内存保存程序     4个段构成         }

        段名        Segment  [定位类型]  [组合类型]  [ '类别' ]
        段名        ENDS

段的属性

stack        Segment         PARA         STACK         'stack'

段名        Segment         [定位类型] [组合类型] ['类别']        {题干中如果不要求 ,[] 都可以省略}

定位类型:段起始边界对内存空间的要求,

                PAGE、 PARA、 WORD、 BYTE。{页,节,字,字节}

                PARA为隐含的定位方式,段首址的低4位为0{二进制 四位  十六进制 1位},即“节”边界。

组合类型:指示段与段之间怎样连接和定位。

                一般有PUBLIC、STACK、 NONE默认。

类别:是用单引号括起来的字符串,类别相同的放在连续的存储区例如'CODE'、 'STACK' 。

定位参数

通知连接程序,逻辑段的目标代码在存储器中将怎么存放。

4种方式

        (1)BYTE,逻辑段可以从任意地址处开始存放。

        (2) WORD,逻辑段须从偶地址开始存放。

        (3) PARA,逻辑段须从一个能被16整除地址开始存放。

        (4) PAGE,逻辑须段从一个能被256整除地址开始存放。

组合参数

        不同源程序中,同名程序段的连接方式。

                PUBLIC:通知链接程序,把不同模块中具有PUBLIC属性的同名段,在满足定位方式的前提下,组成一个逻辑段。

                STACK:把不同模块中具有STACK属性的同名段链接成一个大的堆栈段。链接后堆栈段的空间是链接前各模块预留堆栈空间之和。

AT:逻辑段在定位时,其段基址等于表达式给出的值。AT属性常和ORG伪指令配合。

Dseg        SEGMENT AT 0040H                    ;段地址  0040

                  ORG        0017H        ;有效地址

Tmp                DB        ?

Dseg        ENDS

AT参数不能在代码段中使用。      CS:IP  CPU指令

缺省:该段是一个独立的段,不进行链接。

类别

        数据段—‘Data’

        代码段——‘Code’

        堆栈段—‘Stack’

段定义举例

        Dseg Segment         'data

                Buf db 'l am a student','$'

        Dseg Ends

相邻段地址之间的最小距离为( )。

A、16个字节

B、64K字节

C、1K字节

D、256字节

DAT SEGMENT STCK  'STACK'

                        DW 100 DUP(0)

DATA ENDS                

此处定义的含义是()。

A.定义100个字节的堆栈段

B.定义100个字节的数据段

c.定义200个字节的堆栈段

D.定义200个字节的数据段

 (2)数据定义:

简答变量的三个属性是什么?

        段属性:所在段的段地址

        偏移属性:段内偏移地址

        类型属性:每个数据项的字节数。

                比如,DB类型值为1,

                          DW类型值为2,

                          DD类型值为4。

数值回送运算符分别是SEG, OFFSET, TYPE

        DB、DW、DD的区别

例1:在数据定义中,定义字符串时,应使用的伪指令是()

        A. DB         B. DW         C. DD        D.DQ
————————————————————————————————————————

        STR        DB        ‘abcde’

        STR        DB        ’a‘‘b’‘c’‘d’’e'

例2.在BUF DB 2 DUP (0,0,30H,0,30H )定义的数据单元中,能够成为3000H的字存储单元有d多少个  

如果有以下定义域句

        BVAR        DB 101B,7, 'D' ,OFH,-1,2×56,

        则BVAR+4内存单元中的字节内容是

例4:下列变量各占多少字节?

A1 DW 23H,5876H

A2 DB 3 DUP (?),OAH,ODH, '$'

A3 D 5 DUP(1234H, 567890H)

A4 DB 4 DUP(3 DUP(1, 2,ABC))

DB DW        S1 DB         `a'

                    S2 DBU         'a'

                     S3 DB         ‘ab’

                     S4 DW         ’ ab‘

                       S5    DB      'abc'

                        S6   DW     `abc'     X

例5:执行下列指令后, AX寄存器的内容是什么?
      

  TABLE DW , 100, 200, 300, 400

        DISTA DW 6

(1)   MOV BX, OFFSET TABLE

        ADD BX, DISTA

        MOV AX, [BX]

(2) LEA BX,TABLE

        MOV AX, 2[BX]

(3)    MOV SI,

        4MOV BX, OFFSET TABLE

        MOV AX, [BX][SI]

(4)    MOV BX, DISTA

        MOV AX, TABLE[BX]

300 100 200 300

        下列指令执行后,AX= 4141H       DX=  6162H

B1        DB        'ABC'

W1        DW        'ab'

                .....

                MOV        AL,B1

                MOV        AH,B1

                MOV        DX,W1

——————————————————————————

与字定义不同的是      W2    DW ,'a','b'

0061,0062

w1 dw 'ab'   一个字 占用两个字节     

w2 dw 'a','b'  两个字  占用  4 个字节 

 S1 12345678

S2 0012003400560078

总结DB、DW、DD

请分别用DB,DW、 DD伪指令写出在BUF开始的连续8个单元中依次存放数据:

11H、22H、33H、44H、55H、66H、77H、88H的数据定义语句。

11
22
33
44
55        
66
77
88

s1  db = 11,22,33,44,55,66,77,88

s1   dw = 2211,4433,6655,8877

s1   dd = 44332211,88776655

已知BX=2,指出下列程序执行后AL寄存器的内容。
 

DATA SEGMENT

        VARI = 10 MOD 7        ;    3    MOD 取余   符号定义伪指令    =  和 EQU  

        VAR2 EQU 10H           ;    16    符号定义不占用内存

        VAR3 DB VAR2 DUP (30H)        ;在内存当中   从VAR3开始占用内存

        VAR4 DB 20H,10H,80H

DATA ENDS

(1) MOV AL, VARI        ;AL=

(2) MOV AL ,VAR2        ;AL=

(3) MOV AL , VAR3        ;AL=

(4) MOV AL, VAR4 [BX]         ;AL=CE

BUF DW 10 DUP(3 DUP(2,10H),3,5)

上述语句汇编后,为变量BUF分配的存储单元字节数是()

A.10B.80C.100D.160

已定又数据段如下。能使AX中数据为偶数的语句是()

DATA SEGMENT
        ORG 0213H
    DA1 DB 15H, 26H, 37H
    AD2 DW DA1
DATA    ENDS

A. MOV AX, WORD PTR DA1

B. MOV AL, DA1 +2

C. MOV AL, BYTE PTR AD2+1

D. MOV AX, WORD PTR DA1+1专接本INCE

ARY DW 10 DUP (?)     ;定义了一个字变量   10个空

        ........
    
MOV AL, TYPE ARY        ;类型属性

MOV BL, LENGTH   ARY    ;长度属性

MOV CL, SIZE ARY        ;大小属性

上述指令执行后的AL=2 , BL=  10      CL=20

Length:用于变量的前面,返回数组变量的元素个数,即返回

        DUP ()最外层的数值

        没有DUP,则返回1。G

SIZE:返回数组变量所占的总字节数
                SIZE=leng*type 

                             10       2

已知 VAR DW 1,2, $+2,5,6若汇编时VAR分配的偏移地
址是0010H,则汇编后0014H单元的内容是().

16H

AR DW 1,2
AR2 DW 3

C     equ    $-var
s    equ    var2-var    
            0014-0010    S=4

(3)符号定义

        符号定义EQU不占用内存空间
{

                立即数寻址

                不占内存

}

1段定义:ends

2 数据:db  dw  dd

        PTR,$,TYPE

                    length       

                     size

         dup,?
————————————————————

END                ;源程序的结束

ENDS                ;段的结束

ENDP                ; 过程的结束

ENDM                ;  宏指令的结束

:(4)过程定义

        过程的属性:near,far

过程名   proc     [  near,far ]   ;省略的话  默认是 近  ,如果用 调用远的话,后面需要加far


过程名    endp    ; p对应前面过程的保留字     结束的微指令  end

(5) 程序结束 END

        源程序的结束

DATA SEGMENT
A DW O            ;定义变量
B DW O
C DW 100,20,50
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA  ;定义代码段 和数据段
        MAIN PROC FAR            ;定义了一个过程  起始位置  过程名字  proc 远调(和dos程序)
            PUSH DS            ;DS压栈
            XOR AX, AX          ;把AX 0压栈    可以变成MOV    AX ,0
            PUSH AX
                            MOV AX, DATA    ;这两条一定要写,不然CPU找不到段
                            MOV DS, AX
                    MOV BX, OFFSET C
                    MOV AX, [BX]
                    MOV B, AX    
                    MOV AX, 2[BX]
                    ADD AX, B
                    MOV A, AX
            RET    ;   一定要有RET
        MAIN ENDP                    ;过程结束位置 
        
            CODE ENDS                ;段结束
            END                        ;源程序的结束

没有ORG起始地址 默认从0地址开始

有ORG 从指定的位置开始

call    Z1        proc

                push        ax

                push        bx

                .........

                pop        bx

                pop        ax

                ret                  ;自动弹出断点 

          Z1        ENDP

INT        21H        ;psw    cs,ip

inet                        ;IP        CS        PSW

————————————————————

CALL     Z1:    压的是  CS;IP 

                        段间  CS

                        段内        IP

中断调用 和  子程序调用的区别

(6)ASSUME

关联段名

指定段寄存器段名关联

必须由用户在程序开始时编写代码完成装入。


 

cs:code    ;指定带代码段  ds: date    ;指定到数据段
。。。。。。。

    MOV    AX,date

    MOV    DS,AX

MOV    DS,DATE   ;是不合法的   立即数 DATE 

    (7)ORG微指令

        ORG数值表达式

例:ORG 20H

BUF DW 0012H, 5678H

执行MOV AX,BUF+2后,AX的值为

        LEA BX,BUF+2后,BX的值为

DATA SEGMENT
    D1    EQU 0100H
        ORG 2300H
    D2   DW 35ABH
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE, DS:ATA
START:MOV AX,SEG D1 /DATa
      MOV DS, AX
       MOV BX, 2000H
       MOV SI, 0200H
        MOV DX, D1 [BX] [SI]     基址变址相对寻址
       LEA BX, D1 [BX] [SI]
MOV AH, 4CH
    INT 21Η
CODE ENDS
    END START


——————————————————
DX=35ABH    BX=2300

考点3        DOS功能调用的应用

            INT        21H
                                {

                                        MOV        AH,1        ;键盘接收

                                        MOV        AH,2        ;屏幕显示单个字符

                                        MOV        AH,9        ;屏幕显示字符串

                                        MO          AH,4CH        ;返回DOS环境

}    

功能都在 AH中 

考点4        汇编语言程序编程

1.汇编程序注意事项:

        每行最多4个组成部分;

        双操作数时,中间不能丢掉逗号;

        程序至少有一个代码段

        结束程序指令并返回操作系统的方法有两种

                        PUSH    DS

                        XOR        AX,AX

                        PUSH        AX

                                .....

                        RET

MOV        AH,4CH

INT                21H

2.汇编语言源程序的基本格式:        

        DATA        SEGMENT

        DATA        ENDS

        EXTRA        SEGMENT

        EXTRA        ENDS

        STACK        SEGMENT        PARA        STACK

        STACK        ENDS

CODE SEGMENT
    ASSUME CS: CODE, DS: DATA, SS: STACK, ES: EXTRA   ;全部进行了指定
START: MOV AX, DATA      ;都是立即数
        MOV DS, AX
        MOV AX, EXTRA
        MOV ES, AX
        MOV AX, STACK
        MOV SS, AX
        MOV AH, 4CH
        INT 21H
CODE ENDS
    END START

        例1:编程实现求S=(X2+Y2)/z的值,并将结果放入RESULT单元。DATA SEGMENTX DB 2Y DB9Z DB 6RESULT DB?DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
    MOV DS,AX                                ;XOR    AX,AX     ;清0
    
    MOV AL,X                                ;MOV    AX,X
    MOV BL,AL                                ;MUL    X
    MUL BLMOV DX,AX

    MOV AL,Y
    MOV BL,AL
    MUL BL
   
     ADD AX,DX
    
    MOV BL,Z
    DIV BL                                ;AX/BL——商AL,余AH
    MOV RESULT,AL
    MOV AH,4CH
    INT 21H    
CODE ENDS
    END START

例2:请写出汇编语言程序实现如下功能:

从键盘输入1~5中的任何一个数,分别在屏幕上显示"1st"、" 2st"、“3st"、”4st"、" 5st"其他字符则显示“*”


利用字符串输出

DATA SEGMENT 
	BUF DB  'st','$'    ;9号功能定义的字符串  一定要 $符号结束的   显字符串的一种标志
DATA ENDS
CODE SEGMENT
	ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
			MOV DS,AX
			MOV AX,0
			MOV AH,01H
			INT 21H
			MOV AH,02H
			CMP AL,'1'
			JB L1 
			CMP AL,'5'
			JA L1
			MOV DL ,AL
			INT 21H
			LEA DX,BUF    ;有效地址 一定要给DX
			MOV AH,09H    ;利用9号功能一定要定义
			INT 21H
			JMP EXIT
		 L1:MOV DL,'*'
			INT 21H
	   EXIT:MOV AH,4CH
			INT 21H
CODE ENDS
	END START	

伪指令不占用内存

START 开始 

例3:编写完整程序:

        将键盘输入的小写字母转换成大写字母并输出显示,直到输入字符'#结束

        如果输入的不是小写字母时要显示错误提示PLEASE INPUT AGAIN!'。

DATA SEGMENT
    ERROR DB '请再一次输入!', ODH, OAH, '$' 
DATA ENDS
CODE SEGMENT
        ASSUME CS:CODE, DS:DATA
    START: MOV AX, DATA
           MOV DS, AX
    
    NEXT:MOV    AH,1     ;利用1号功能接收字符
          INT    21H      ;     
          CMP    AL,'#'     ;和#进行比较
          JE     EXIT        ;如果是 就EXIT

        CMP AL,'a'       ;小于小A             
        JB    ERR    

                ERR:LEA    DX,ERROR   ;返回  再一次输入
                    MOV    AH,9
                    INT    21H    
                    JMP    NEXT
                EXIT:MOV    AH,4CH
                     INT    21H
        CMP   AL,'z'
        JA    ERR
        
        SUB    AL,20H
        MOV    DL,AL
        MOV    AH,2
        INT    21H
        JMP    NEXT    
CODE ENDS
    END START

例4:17

        编写完整汇编语言程序实现如下功能。

在M单元和N单元分别存有一个8位无符号数36H和95H,

要求比较这两个无符号数,并根据比较结果在屏幕上显示M>N或N>M (假设这两个数不相等) 。

data segment
    M DB 36H
    N DB 95H
STR1 DB 'M>N', '$'
STR2 DB 'N>M', '$'
data ends
code segment
    assume ds:data,cs:code 
start: MOV AX,DATA 
       MOV DS,AX

    MOV AL,M
    MOV BL,N
    CMP AL,BL
    JA L1
    LEA DX,STR2
    JMP L2
L1: LEA DX,STR1
L2: MOV AH,09H
    INT 21H
    MOV AH,4CH 
    INT 21H
code ends
    end start

例5 :用汇编语言编写程序,从外设71H读取一个数M,判断其值是否在10和20之间,

如果M2 20,则送OFFH给外设73H

如果M<10,则送00H给外设73H;

如果10<M<20,则送88H给外设73H。

CODE SEGMENT
    ASSUME CS:CODE
START: IN AL,71H
    CLC
    CMP AL,10
    JC    LP1
    CMP AL,20
    JC    LP2
    MOV BL,OFFH
    JMP LP3
  LP1:MOV BL,0
      JMP LP3
  LP2:MOV BL,88H
  LP3: MOV AL,BL
        OUT 73H,AL
        MOV AH,4CH
        INT 21H
    CODE ENDS
        END START

例6

        在内存单元BUF中存放着一个8位有符号二进制数X,试根据关系,用8086汇编语言编写程序求Y值,并将结果存入RESU单元: X大于0时,Y为1; X等于0时,Y为0;X小于0时,Y为-1

data Segment
    buf    DB    5
  result    DB    ?
data    ends
code    Segment
    assume    cs:code,ds:data
 start:mov mov,data
mov     ds,ax    
mov    AL,buf
cmp    al,0
JG    L1
JZ    L2
MOV    BL,-1
JMP    C3
L1:MOV    BL,1
    JMP    L3
L2:MOV    BL,0
L3:MOV    RESULT,BL
   MOV    AH,4CH
    INT    21H
CODE    ENAS    END    STANT

自内存0500H单元开始,保存有10个无符号字节类型的数据,分别为45H, 89H, 11H, 26H, 8AH、 9FH, 78H、 OAAH, 18H、 ЗEH请编写程序,求这10个数之和。

要求:

        (1)用8位二进制数运算方式进行计算。

        (2)结果用两个字节表示。

        (3)把结果存放到050AH和050BH单元,且高字节放在050BH单元。

在DATA1单元开始存放10个无符号字节数据,编程求10个中偶数的个数,将结果存于DATA2单元。

DATA SEGMENT
    DATA1 DB 0,1,2,3,4,5,6,7,8,9   ;定义10个无符号数
    DATA2 DB ?
DATA    ENDS
    CODE    SEGMENT
        ASSUME    CS:CODE,DS:DATA
            START:MOV    AX,DATA
                  MOV    DS,AX
                   LEA    BX,DATA1
                    MOV    AL,[BX]
                    TEST    AL,01H
                    JZ    L1

考点5        子程序的相关知

        顺序:(X^2+Y^2)/子
                        {

                字符串                

}

分之{

                        比较  小转大

                        分段函数

}

循环{

        从1加到100

        10个数求和

        10个中统计    偶数   正/负        0的个数

}

X>=90

90>x>=80

80>x>=70

70>x>=60

60>x>=50

例:写出下列程序的功能,并画出程序框图
Datas Segment
    n DW ?
  sum DW ?
Datas Ends
Stack Segment PARA Stack 'stack'
    DW 200 DUP(?)
Stack Ends
Codes Segment
Main Proc FAR
    Assume CS: Codes, DS: Datas, SS: Stack
    Start:PUSH DS                                ;AX=0;BX=0
          MOV AX,0
          PUSH AX
           MOV AX,Datas
          MOV DS,AX                                BX+1----x
          MOV AX,0
          MOV BX,0
LOOPT: INC BX                                    AX=AX+BX
       ADD AX,BX
       CMP AX,1000                            AX=<1000
       JBE LOOPT
        MOV n,BX                               ;否  给N
        MOV sum,AX                            sum——ax
        RET        
Main Endp                                     end
Codes Ends
    End Start

————————————————————————
循环直到大于1000时停止循环

考点6        汇编A程序上机过程     

.asm

.obj

.exe           


        总结   

标号和变量的命名和用法

伪指令的类型和功能

汇编语言程序编程

汇编程序上机调试过程

                                                        

posted @ 2023-06-04 22:50  YJlio  阅读(154)  评论(0编辑  收藏  举报  来源