Diretório do artigo
5.4 depuração e assembler instruções de diferentes tratamentos masm
我们在Debug中写过类似的指令:
mov ax,[0]
表示将ds:0处的数据送入al中
但是再汇编源程序中,"mov ax,[0]"指令被编译器当作"mov ax,0"处理
Tarefa: a memória 2000: 0,2000: 1,2000: 2,2000: de entrada unidade de dados de três ai, bl, cl, em dl.
realização de depuração:
Compiler Implementação:
Resumo:
- masm编译器中,[idata]被解释为idata。
- 可以用寄存器bx来实现,mov bx,1;mov bl,[bx]即可
- 还可以把段地址显式的表现出来,如mov bl,ds:[1]
5.5 loop e [BX] da combinação
Considere-se um problema: ffff Calculado: 0-ffff: b da unidade de dados e o resultado é armazenado na dx.
(1) armazenar o resultado da operação irá exceder o âmbito da dx?
ffff:0~ffff:b是字节单元,范围为0~255,12个累加不会超出范围。
(2) Can ffff: 0 ~ ffff: b dados para o DX acumulada diretamente?
不行,因为ffff:0~ffff:b中的数据是8位的,不能直接累加到16位寄存器dx中。
(3) pode ffff: 0 ~ ffff: b é acumulado em dl dados, e DH é definido como 0?
不行,dl也是8位寄存器,累加可能造成进位丢失
solução:
mov al,ds:[0]
mov ah,0
add dx,ax
使用以上结构用ax作为中介进行累加
5.4 Os procedimentos usados para atingir o ciclo de instruções anteriormente
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov bx,0
mov dx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
5.6 Segmento Prefixo
Instrução "mov ax, [bx]", o endereço de offset da célula de memória é dada por bx, e o endereço de segmento dos ds padrão. Estas instruções são exibidas na unidade de acesso à memória, um endereço de segmento especifica explicitamente o "DS:" unidade de memória "CS: ", "ss:" ou "es:", o segmento prefixo na linguagem assembly .
5.7 um espaço seguro
Em 8086 modo, basta escrever para algum espaço de memória é muito perigoso, porque este espaço pode armazenar dados importantes do sistema ou código.
Em geral, o PC, o modo DOS, DOS e outros programas legítimos geralmente não usam 0: 256 bytes de 2ff espaço: 200 a 0. Então, nós usamos este espaço para ser seguro.
5.8 Uso prefixo segmento
Tarefas: ffff: 0 ~ ffff: b unidade de dados de cópia para 0: 200-0: unidades 20b
assume cs:code
code segment
mov bx,0
mov cx,12
s: mov ax,0ffffh
mov ds,ax
mov dl,[ax] ;(dl)=((ds)*16+(bx)),将ffff:bx中的数据送入dl
mov ax,0020h
mov ds,ax ;每次循环设置两次ds,代码效率低下
mov [bx],dl
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
otimização de código:
assume cs:code
code segment
mov ax,0ffffh
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