2014-02-22 93 views
0

我需要計算每一行的有效地址。我知道你將DS向左移一次並添加偏移量,但當您更改默認數據段時,我感到困惑?對於第一行,我只需添加ES + DI而不是使用DS?在彙編中計算有效地址

使用這些:Register Numbers 一個我知道的一個例子是右

IN AL, 70H 

OUT DX, AX 

OUT 21H , AL 
+0

ADD ES:[DI],AL - >地址=(ES << 4)+ DI – rcgldr

+0

好了,所以我得到的答案3A000H?有什麼方法可以將這些輸入模擬器並檢查我的答案嗎? – TuscanAu

+0

是的,通過觀看地址03a000h處的內存並查看該指令是否被更改。 – rcgldr

回答

1

IN/OUT不使用段寄存器中,I/O地址(端口號)的任一中的立即操作數指定

IN AL, 70H ; Read one byte from I/O port 70H 
OUT 21H, AL ; Write one byte to I/O port 21H 

或DX寄存器

OUT DX, AX ; Write two bytes from AX to I/O port specified in DX 

您提供了以下值寄存器

enter image description here

這不是明擺着有哪個字節是低字節,而這是高字節(x86使用little-endian字節順序)。假設DX具有值0022H和AX是2355H然後

OUT DX, AX ; Write 2355H (AX) to port 0022H (16-bit data bus) 

http://en.wikipedia.org/wiki/Intel_8086

+0

好吧,所以我得到了確認,一切正常,但OUT DX,AX。它確實利用了兩個端口,但地址總線只識別端口0022H。除此之外,這是一個很好的答案! – TuscanAu

+0

啊,對,8086有一個16位數據總線。我會解決答案。 – amdn