2012-09-28 226 views
0

可能重複:
NASM 16bit IntelMOV BL,[AX]錯誤

我正在彙編代碼用於微處理器過程簡單的微處理器。我正在編寫一個程序:將從地址300開始存儲在內存中的六個元素相加,但忽略80個十六進制或更高(>=80h)或20十六進制或更低(<=20h)的內容。在6次比較之後,程序應該停止,甚至數字被添加。

這裏是我的代碼:

E 300 30 40 50 60 70 75 
    A 100 
100:MOV AX,2FF 
103:ADD AX,1 
106:CMP AX,306 
109:JAE 11C 
10B:MOV BL,[AX] 
10E:CMP BL,20 
111:JBE 103 
113:CMP BL,80 
116:JAE 103 
118:ADD CL,BL 
11A:JMP 103 
11C:INT3 

但我在這行收到一個錯誤:

10B:MOV BL,[AX] 

有誰知道爲什麼嗎?

+1

什麼是錯誤? – Dan

+0

你應該對錯誤更具體。或者,也許你只是不想被幫助? – IdiotFromOutOfNowhere

回答

0

嗯,我不確定,但我猜你試圖將擴展(aX)寄存器的內容複製到另一個寄存器的低位部分(bL)。

大概下部只是延長的一半大小...

+0

否否此表示轉到存儲在寄存器AX中的存儲地址,並將存儲在該存儲單元中的值複製到BL中。 提示:值爲2個十六進制位,因此它來自BL –

+0

沒有辦法... AX包含要讀取的地址,並且將此地址的字節移至BL。 – IdiotFromOutOfNowhere

+0

-1:您的回答不正確。 「你試圖將擴展(aX)寄存器的內容複製到另一個寄存器的低部分(bL)中」。這是不正確的。 'mov bl,[ax]'失敗,因爲在16位x86彙編中不存在這樣的尋址形式,如[ax]。如果有,在Intel語法中,它會將字節的值從'ax'定義的內存偏移量複製到'bl'。有例如。 'mov al,[bx]'將從'bx'定義的內存偏移量的字節值複製到'al'。 – nrz

5

16位尋址模式包含一個可選的偏移,可選的基址寄存器(BX,BP),和可選的變址寄存器(SI ,di)。而已! 「[ax]」不在列表中。 32位尋址模式更加靈活 - 任何通用寄存器都可以作爲基址,任何GPR,但esp都可以被索引 - 而2,4,8的「scale」可以被索引所乘。學過32位尋址模式的人很高興忘記16位尋址模式......顯然有些人有。 :)

最好, 弗蘭克

+0

從來沒有做過16位的下降: - /我喜歡看到周圍的人仍然有__not__忘記那些東西:-) – IdiotFromOutOfNowhere