[bx]
- 编译器和直接在shell里写[0]解析不一致
- 编译器:mov al,[0] = mov al,0
- shell:mov al,[0] = mov al, ds:[0]
- 为了编译器解析的一致性,用[bx]做中间跳板
- mov bx,0
- mov ax,[bx]
- mov al,[bx]
- 描述内存单元
- 内存单元的地址
- 内存单元的长度(类型)
- 编译器和直接在shell里写[0]解析不一致
loop
- 描述性符号(X),X的值
- (ax)=0010H
- (21000H)=0010H
- mov ax,[2] = (ax) = (ds)*16+2
- idata:约定符号,表示常量
loop指令
- (cx) = (cx)-1
- 跳到标号
assume cs:codesg
codesg segment
start:
mov ax,2
mov cx,11 ;2^12
s:add ax,ax
loop s ;cx-1,判断cx=0时跳出,编译时编译器自动将s改为偏移地址,loop s将IP置为偏移地址
mov ax,4c00h ;编译器分析默认10进制,要添加h代表16进制
int 21h
codesg ends
end start
运算时要考虑是否会溢出
- 用dx寄存器进行累加:(dx)=(dx)+(ax)
- ffff:0006单元向ax赋值,令(ah)=0 ,(al)=(fff6h)
- 在汇编源程序中,数据不能以字母开头!! ```cpp ;ffff:0006单元数x3,结果存储在dx中
- 描述性符号(X),X的值
assume cs:codesg codesg segment start: mov ax,0ffffh ;在汇编源程序中,数据不能以字母开头!! mov ds,ax mov bx,6 mov al,[bx] ;8位!! mov ah,0 mov dx,0 mov cx,3 s: add dx,ax loop s
mov ax,4c00h
int 21h
codesg ends end start
- 计算ffff:0~ffff:b单元中的数据的和,结果存储在dx中
- 不能直接用dx算加法:16位寄存器不能直接用来8位加法(类型要匹配)
- 也不能累加到dl中,可能造成进位丢失(结果不能越界)
- 解决方法:
- 方法一:用一个16位寄存器来做中介
- mov al,ds:[bx]
- mov ah,0
- add dx,ax
- add bx,1(inc b x)
- 一段安全的空间
- 0:200h~0:2FFh (256字节)
- 0020:0~002F:F
- 用附加段寄存器es辅助ds做段内数据的复制,能节省时间
```cpp
assume cs:code
code segment
mov ax,0fffh
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,12
s:mov dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end