汇编的数据处理思考

数据处理的问题

思考两个问题

1. 处理的数据在什么地方

2. 要处理的数据有多长

`

reg表示寄存器sreg表示段寄存器

reg的集合包括:ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di

sreg的集合包括:ds, ss, cs, es'

只有四个寄存器可以用在[...]中来进行内存单元的寻址

他们分别是bx, si, di, bp

下面的程序是正确的

mov ax, [bx]
mov ax, [bx + si]
mov ax, [bx + di]
mov ax, [bp]
mov ax, [bp + si]
mov ax, [bp + di]

下面的程序是错误的

mov ax, [cx]
mov ax, [ax]
mov ax, [dx]
mov ax, [ds] 

没有寄存器名存在的情况下使用操作符X ptr知名内存单元的长度, X可以为wordbyte

  • word ptr表示指令访问的内存单元是一个字单元
  • byte ptr表示指令访问的内存的那元是一个字节单元
mov ax, 2000h
mov ds, ax
mov word ptr [1000h], 1 ; worde的使用方式
mov byte ptr [1000h], 1 ; byte 的使用方式

push指令只进行字操作,无需指明byteword

div 除法指令(回头在学)

  • 除数:有8为和16位两种,在一个reg或内存单元中
  • 被除数:默认放在ax或dx和ax中
    • 如果除数为8位,被除数则位16位,默认在AX中存放
    • 如果除数位16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
    • 如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;
    • 如果除数位16位,则AX存储除法操作的商,DX存储除法操作的余数

mul 乘法指令

mul是乘法指令,做乘法的时候注意两点

  1. 两个相乘的数:要么都是8位,要么都是16位
    • 都是8位
      • 一个默认放在AL中,另一个放在8位reg或内存字节单元中
      • 结果:默认放在AX中
    • 都是16位
      • 一个默认放在ax中,另一个放在16位reg或内存字单元中
      • 结果:高位默认放在DX中,低位在AX中存放

格式如下

; mul reg
; mul 内存单元
; 例如:8位
mul byte ptr ds:[0] ; (ax) = (al) * ((ds) * 16 + 0)
; 16位
mul word ptr [bx + si + 8] ; (ax) = (ax) * ((ds) * 16 + (bx) + (si) + 8)) 结果的低16为
                           ; (dx) = (ax) * ((ds) * 16 + (bx) + (si) + 8)) 结果的高16为

伪指令dd

dd 用来定义dword(double word,双字)型数据。

data segment
    db 1
    dw 1
    dd 1
data ends

第一个数据为01H,在data:0处,占1个字节

第二个数据为0001H,在data:1处,占1个字节

第三个数据为00000001H,在data:3处,占2个字节

伪指令dup

它和db、dw、dd等数据定义伪指令配合使用,用来进行数据的重复

语法格式如下:

db 重复次数 dup (重复的数据)

例子

db 3 dup(0) ; 相当于 db 0, 0, 0
db 3 dup(0, 1, 2) ; 相当于0, 1, 2, 0, 1, 2, 0, 1, 2
db 3 dup('abc', 'ABC') ; 相当于db 'abcABCabcABCabcABC'

猜你喜欢

转载自www.cnblogs.com/songyaqi/p/11887988.html