(1)向內(nèi)存 0:200 ~ 0:23F 依次傳送數(shù)據(jù)0~63(3FH)
-
0:200~0:200~0:23F
等同于0002:0~0002:3F
assume cs:codesg
codesg segment
mov ax,0020h
mov ds,ax
mov bx,0
mov dl,0
mov cx,40h
s: mov [bx],dl
inc dl
inc bx
loop s
mov ax,4c00h
int 21h
codesg ends
end
- 設(shè)置 ds寄存器 為
0002H
鲫懒,[bx]
便可以訪問到內(nèi)存0002:0~0002:3F
- 修改 書上程序5.9 可以寫出來
(2)向內(nèi)存 0:200 ~ 0:23F 依次傳遞數(shù)據(jù) 0~63(3FH) ,程序中只能使用9條指令,9條指令包括 mov ax,4c00h int 21h
這兩條
assume cs:codesg
codesg segment
mov ax,0020h
mov ds,ax
mov bl,0
mov cx,40h
s: mov [bx],bl
inc bl
loop s
mov ax,4c00h
int 21h
codesg ends
end
- 使用 bx寄存器 的 低8位寄存器bl,
mov bl,0
以及mov [bx],bl
還有inc bl
-
3F
使用8位
足可以表示了 - 因?yàn)槲覀冎挥玫?code>8位坪创,所以在這里
inc bl
就相當(dāng)于inc bx
了挣惰,這里是要想清楚的 - 有一點(diǎn) C語言編程 里面寫
array[ i ] = i
的味道 - 修改 第(1)問的代碼 可以寫出來
(3)程序的功能是將mov ax,4c00H
之前的指令復(fù)制到內(nèi)存 0:200 處呈昔,補(bǔ)全代碼,上機(jī)調(diào)試薛躬,跟蹤運(yùn)行結(jié)果
匯編語言第三版 實(shí)驗(yàn)四 第三問.png
理解題意:什么叫做 mov ax,4c00H 之前的指令 思劳?
- 指令也是數(shù)據(jù),CS:IP 指向的就是指令棒坏,因此,mov ax,_____ 這里必然是填上 CS 的,也就是 mov ax,cs
- 寄存器 CX 控制的是循環(huán)次數(shù)遭笋,那么 mov cx,____ 這里必然要填上一個(gè)數(shù)字坝冕,代表循環(huán)次數(shù)
- 程序的功能是復(fù)制一系列指令,那么cx寄存器后面需要填上的數(shù)字必然與這一系列指令的個(gè)數(shù)相關(guān)
我的嘗試:簡單數(shù)了一下瓦呼,既然mov ax,4c000H 前面有十條指令喂窟,那么就先填一個(gè)十進(jìn)制的數(shù)字10好了
每條指令占用的內(nèi)存單元個(gè)數(shù).png
masm link debug U命令
之后突然想起來,所謂的指令也是數(shù)據(jù)的一種
央串,因此cx寄存器后面要填上的不是單純的指令的個(gè)數(shù)磨澡,而是 指令占用的內(nèi)存單元的個(gè)數(shù)我使用黃色字體標(biāo)出了每種指令占用的具體的內(nèi)存單元個(gè)數(shù),比如第一條
mov ax,cs
占用了內(nèi)存單元從0000到0001质和,就是2個(gè)內(nèi)存單元稳摄,其余的也可以根據(jù)起始的物理地址依次計(jì)算出來最后再把占用的內(nèi)存單元個(gè)數(shù)全部加起來,得到的是 十進(jìn)制二十三饲宿,寫成 十六進(jìn)制 就是
17H
,這個(gè)17H
才是填寫在 CX 寄存器 后面真正的數(shù)字實(shí)際上厦酬,也可以一眼看出來胆描,因?yàn)?
mov ax,4C00h
的起始地址是0017H
,直接與第一條指令的0000H
相減仗阅,馬上就可以得到17H
不要去管循環(huán)不循環(huán)昌讲,當(dāng)你要復(fù)制什么東西的時(shí)候,只要把它當(dāng)做數(shù)據(jù)看就可以了
我的解答:完整匯編源代碼以及上機(jī)調(diào)試跟蹤
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020H
mov es,ax
mov bx,0
mov cx,17H
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00H
int 21H
code ends
end
-
將 CX 寄存器 后面的數(shù)字修改成正確的 17H减噪,代表占用的23個(gè)內(nèi)存單元
8位可以表示的數(shù)據(jù)占用內(nèi)存單元相同.png -
使用 debug 的 d命令 查看內(nèi)存單元0020處的數(shù)據(jù)短绸,看到全部正確復(fù)制過來了
指令復(fù)制到0020處開始的內(nèi)存空間.png
問題(3)的難點(diǎn)
- 需要真正理解 指令也是數(shù)據(jù),全都是數(shù)據(jù)
- 具體占用的內(nèi)存單元個(gè)數(shù)要 通過 具體地上機(jī)操作 才可以數(shù)出來筹裕,
寄存器CX
后面的數(shù)字當(dāng)然不是亂猜的鸠按,但是必須先寫一個(gè)數(shù)字讓代碼被編譯、連接饶碘、執(zhí)行跑起來目尖,我們才可以看到真正的內(nèi)存單元個(gè)數(shù)