命令デバッグのプログラムループで実現5.3追跡ループ
アセンブラで進数のデータは、データには9FFFHより大きいが0に先行する、文字で始まるありません
DS = 075AHは、私たちはDS + 10H = 076AHのプログラムのアドレスを知ることができるので
CSのための最初の命令指示プログラム:IP
ショーのDS:0006Hのアドレスデータが格納されています
グラム「オフセット」
命令の実行に先立ってオフセットアドレス
ループに入るとき、P命令は、デバッグをするまで(CX)= 0になるまで行うこと
異なる処理MASM 5.4デバッグとアセンブラ指示
でのデバッグ
MOV斧、2000 のMOV DS、斧 のMOVら、[ 0 ] のMOV BL、[ 1 ] のMOV CL、[ 2 ]
デバッグ[0](AL)=((DS)* 16 + 0)に処理されるであろう···
MASMコンパイラ
コード仮定 コードセグメント MOV斧、2000 のMOV DS、AX MOVら、[ 0 ] MOV BLを、[ 1 ] のMOV AX、4c00hの int型21Hの コードが終了する 端部
[0]の処理が00、セグメントアドレスを追加しないであろう
解決方法:MOVら、DS:[0]
5.5ループと[BX]組み合わせの
计算ffff:0~ffff:b的数据总和,结果储存在dx中
1.不能直接将ds:[0]~ds:[0bh]中的数据放入dx中,因为前者是一个字节,8位寄存器,后者是一个字,两字节,16位寄存器。
2.不能使用dl累加ds:[0]~ds:[0bh]中数据,因为dl位8位寄存器,最大存储的数据为255,ds:[0]~ds:[0bh]每个都是8位寄存器,累加容易越界。
因此,我们使用一个中介ax的16位寄存器中的低位储存ds:[0]~ds:[0bh],再累加到dx
assume cs:code code segment mov ax,0ffffh mov ds,ax mov al,ds:[0] mov ah,0 mov dx,ax mov al,ds:[1] mov ah,0 mov dx,ax ... mov al,ds:[0bh] mov ah,0 add dx,ax mov ax,4c00h int 21h code ends end
使用循环优化上面程序
assume cs:code code segment mov ax,0ffffh mov ds,ax mov bx,0 mov cx,12 s: mov al,ds:[bx] mov ah,0 add dx,ax inc bx loop s mov ax,4c00h int 21h code ends end
5.6 段前缀
出现在访问内存单元的指令中,用于显示地指明内存单元的段地址的"ds:","cs:","ss:","es:",在汇编语言中称为段前缀
5.7 一段安全的空间
DOS和其他合法程序一般都不会使用0:200~0:2ff(00200hh~002ffh)的256个字节空间。因此我们需要写入数据就往0:200~0:2ff中写入。
5.8 段前缀的使用
assume cs:code code segment mov ax,0ffffh mov ds,ax ;ds段寄存器 mov ax,20h mov es,ax ;es段寄存器 mov bx,0 mov cx,12 s: mov al,ds:[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
实验4 [bx]和loop的使用
(1)
assume cs:code code segment mov ax,20h mov ds,ax mov bx,0 mov cx,64 s: mov [bx],bl inc bl loop s mov ax,4c00h int 21h code ends end
(2)没变,刚好9条,第一题应该地址和传递数据是分开的,所以第二题要求9条
1 assume cs:code 2 code segment 3 mov ax,20h 4 mov ds,ax 5 6 mov bx,0 7 mov cx,64 8 s: mov [bx],bl 9 inc bl 10 loop s 11 12 mov ax,4c00h 13 int 21h 14 15 code ends 16 end
(3)
1) 复制的是存放程序代码的数据,从076a:0~076a:11
0~10h一共需要执行17次
所以第一个空填076ah,第二个空填17