2012-03-09 23 views
1

我在簡單的彙編程序中遇到了麻煩。我不知道我爲什麼會發生,但是有問題。 任務是:在彙編器的兩個陣列(鴯鶓8086)的計算標量積 這是我的代碼彙編程序任務:兩個數組的標量積

; multi-segment executable file template. 

數據段 ;在這裏添加您的數據! n1 db 1,2,3 n2 db 4,5,6 i db? j db?

k dw ? 
pkey db "press any key...$" 

結束

堆棧段 DW 128 DUP(0) 結束

代碼段 開始: ;集段寄存器: MOV AX,數據 MOV DS,斧 MOV ES,斧

mov al,00h 
mov ah,02h 

mov ch,00h 
mov cl,03h 

mov bx,offset n1 
ciklus: 

mov dl,[bx] 
;add dl,30h 


mov j,0d 

add j,dl 
int 21h 
mov al,j 
mov ah,0h 


inc bx 
inc bx 
inc bx 
mov dl,[bx] 
;add dl,30h 

mov i,0d 
add i,dl 
mul i 

mov k,ax 


mov al,00h 
mov ah,02h 
int 21h 



dec bx 
dec bx 
dec bx 

inc bx 



loop ciklus 

lea dx, pkey 
mov ah, 9 
int 21h  ; output string at ds:dx 

; wait for any key....  
mov ah, 1 
int 21h 

mov ax, 4c00h ; exit to operating system. 
int 21h  

結束

端開始;設置入口點並停止彙編程序。

所以當我一步一步地運行程序時,我在ax中看到奇怪的值。我想 1x4 2x5 3x6 => 4 10 18保存在某個變量中並打印到屏幕上。

如果有人能幫助我,我將不勝感激。 P.S這是我在彙編程序編程的小菜,所以不要生我的愚蠢問題。

+0

您是否正在使用調試器來查看出錯和何時出現? – 2012-03-09 23:44:59

+0

是的。當我運行一步一步我看到手術後多我(結果應該走在斧頭)和斧是31h * 34 * = 09F4 [2548 dec],結果應該是4(1 * 4 = 4)...我不'不知道我錯在哪裏。 – user1260255 2012-03-10 10:49:03

回答

0

ciklus:標籤後,您要添加的0x30到dl,那麼在這一點上添加dlj,所以j >= 0x30。在中斷之後,您將al設置爲jah0x0,因此ax >= 0x30。稍後,您將0x30添加到dl,然後將dl添加到i

所以mul i是有效:[DX:AX] = I *斧頭,這將是在至少(*的0x30的0x30),即,ax >= 2304, dx = 0。較大,取決於[bx],i,j的內容。

mul後覆蓋ax寄存器的值:0x200(512),無論如何,所以結果將丟失。簡而言之,您需要在將其註銷以用作中斷服務代碼之前,先保存運行中的寄存器ax [ah:al]

P.S.您可能會考慮使用sidi寄存器來保存工作值。

+0

我知道我需要保存來自多個地方的結果,但是多邊結果是09F4h,就像我說的那樣,我不需要這個數字......我讀了你的答案,但我不知道爲什麼是09F4爲什麼不34h? :(我迷路了...會很好,如果你可以,並有時間來糾正這個簡單的程序.btw謝謝你的回答 – user1260255 2012-03-10 13:07:53

+0

@ user1260255 - 我已經描述了爲什麼寄存器和變量保持它們所做的值,以及爲什麼'mul'會產生你所看到的結果,你需要一支筆和紙,一些關於指令做什麼的參考資料,它們影響什麼寄存器,以及一步一步看看調試器報告的內容,這是一個簡短的程序,我懷疑這項任務的目標之一是學習如何調試。 – 2012-03-10 14:47:38

+0

@ user1260255 - 我並不是想要苛刻,而是像下面這樣的一個片段:'sub dl,30h; inc bx; inc bx; inc bx; mov dl,[bx];' - 爲什麼要從'dl'中減去,只是爲了重新加載它?爲什麼使用'inc bx' 3次,'add bx,3'就足夠了?通過並檢查假設,在循環的第一次迭代中'i'和'j'具有哪些值?不應該將它們初始化爲已知值嗎? – 2012-03-10 14:58:30