1樓:
當然是mov cs:[bx],[sp]
add sp,2
但是隻是形式上等同,mov cs:[bx],[sp]不能被編譯,只有bx,bp,si,di,立即數及他們的組合可以出現在中,bx,bp不能同時出現,si,di也不能同時出現。
sp可以被認為指標
int *sp;
int a;
...mov a,[sp]相當a=*sp;
int *sp;
int *a;
...mov a,sp相當a=sp;
2樓:匿名使用者
sp表示偏移地址。
pop cs:[bx] 等同於
mov ax, ss:[sp]
add sp,2
mov cs:[bx],ax
3樓:匿名使用者
mov cs:[bx],sp 送到cs:[bx]的是sp暫存器的內容
暫存器加 就把暫存器的內容當做地址用了
不過sp不能做指標
應該是這樣
mov bp,sp
mov ax,ss:[bp]
add sp,2
mov cs:[bx],ax
4樓:平庸小魚
sp 是棧頂指標, pop cs:[bx]就是把cs:[bx]裡面的一個word壓到棧裡面,並且指標往下移一個word,也就是兩個位元組。
5樓:匿名使用者
8086堆疊 資料方式:先進後出或者後進先出,pop cs:[bx] 1、將ss:sp指向的記憶體單元的資料送入ax,然後地址加2,最後再把ax裡面的內容送入cs中,
注意出棧的順序:先推資料,然後地址加2
它為向下生長型的。
mov ax, ss:[sp]
add sp,2
mov cs:[bx],ax
一條簡單的8086組合語言提問 60
6樓:
這個程式有點錯誤. 改正後倒是可以在如xp等的控制檯視窗裡執行.
code segment
assume cs:code
e:mov ax,0b800h
mov ds,ax
mov al,'b'
push ax
call s11
mov cx,4c00h ; 誤,改成mov ax, 4c00h
int 21h
s11:mov bp,sp
mov ax,[bp+2]
mov ds:[1],01011001b ; 這是顏色值吧,寫成mov byte ptr ds:[1], 01011001b 更佳
mov ds:[0],al ;寫傳過去的ascii字元到視訊記憶體
ret 2
code ends
end e
最後是執行的時候要注意,最好在執行前先開好cmd視窗,在cmd命令提示符中把本程式所在的目錄設為當前目錄。
因為本程式直接訪問了視訊記憶體,所以要在虛擬86環境下執行,可能輸出的顯示效果有問題,且因為執行結果與螢幕有關,在執行前分別執行下cls(清屏)與
debug然後輸入q退出debug,
最後再輸入本程式可執行程式名執行,一般來說會看到執行結果。
7樓:宇文夢旋
mov指令的執行速度會比lea指令更快 再就是 offset 只能與簡單的符號地址相連 而不能和諸如var1[si]等複雜運算元相連 其他應該就沒什麼不同了
8樓:匿名使用者
程式裡面沒有要求顯示字元的dos中斷啊?
8086組合語言小問題
9樓:湯旺河邊
別的組合語言,我不瞭解。intel 8086/8088組合語言編譯器開始時所預設的整數進製為十進位制。指令:mov ax,25中的25,指十進位制的25。
可以用進位制偽指令radix來改變預設的進位制。
偽指令radix用來設定整數的預設進位制,巨集彙編開始時所預設的整數進製為十進位制。該偽指令的使用格式如下:
.radix exp
其中:偽指令前面要用點『.』開始,exp的值必須是區間[2, 16]內的一個整數。
該偽指令說明其下面整數的預設進製為exp。如果某整數已顯式地表明瞭其進位制,則該預設進位制對其不起作用。在原始檔中,可以使用多個radix偽指令來分別說明其後整數的預設進位制,但為了避免引起不必要誤會,我們不提倡這樣去做。
例如:.radix 8
b1 db 10, 11, 12 ;這三個數是八進位制數
db 10d ;這數是十進位制數,因為它已用'd'明確說明而不使用預設進位制
… .radix 10
mov ax, 1234 ;1234是十進位制數
mov ax, 1234h ;1234h是十六進位制數
10樓:匿名使用者
很明顯,如果沒有加h的話,這是預設為十進位制的,程式設計要注意這個問題。
11樓:闕向晨裘材
這兩個數的加法,已經產生了進位。
這個進位,要當做256,最終結果是263:
10000010
+10000100+1
-------------------
100000111
2567
=263
減法,就是借位的問題了,可以仿照上面分析計算。
8086組合語言小問題.謝謝
12樓:頹廢_小胖
1. 'what is you name ? $' 1個字元佔一個位元組,你可以自己數一下。
不管你用'a'還是ask碼結果都是ask碼,只是編譯器自動將你的'a'轉成了ask碼。
2.這個問題比較複雜,回車實際上回到行首,而換行是換一行,在不同的作業系統裡的規定是不一樣的。我給你找一段資料你自己看看,不懂再問。
回車」(carriage return)和「換行」(line feed)這兩個概念的來歷和區別。
在計算機還沒有出現之前,有一種叫做電傳打字機(teletype model 33,linux/unix下的tty概念也來自於此)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。
要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。
於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。一個叫做「回車」,告訴打字機把列印頭定位在左邊界;另一個叫做「換行」,告訴打字機把紙向下移一行。這就是「換行」和「回車」的來歷,從它們的英語名字上也可以看出一二。
後來,計算機發明瞭,這兩個概念也就被般到了計算機上。那時,儲存器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加一個就可以。於是,就出現了分歧。
unix系統裡,每行結尾只有「《換行》」,即"\n";windows系統裡面,每行結尾是「《換行》《回車 >」,即「\n\r」;mac系統裡,每行結尾是「《回車》」,即"\n";。一個直接後果是,unix/mac系統下的檔案在 windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出一個^m符號。
c語言程式設計時(windows系統)
\r 就是return 回到 本行行首 這就會把這一行以前的輸出 覆蓋掉。
如: 最後只顯示 xixi 而 hahaha 背覆蓋了
int main ()
\n 是回車+換行 把游標 先移到 行首 然後換到下一行 也就是 下一行的行首拉
int main()
13樓:匿名使用者
1、兩種定義都可以了,定義'what is you name ?$'這個是19位元組呀
2、0d是回車,回到行首,0a是換行,回到行首後換下一行啊,不然再輸出會覆蓋已經輸出的字元啊,經典的用法是以前印表機(注意是以前,現在不行了)先打y,再打=,就成了¥了。
之所以你認為回車不就換行了嗎,這是作業系統自動進行的,不信,你在一個文字文件裡,只輸入一個回車,看屬性就變成兩個位元組。(windows系統下,在linux下文字文件中一個換行符就代表一個回車加一個換行,而且換行符還是回車鍵輸入的呢)
關於8086組合語言的基礎問題
14樓:
[1352h]預設在ds段,所以地址就是ds*16+1352h=31352h
0150h[bx]相當於[bx+0150h],寫法不同而已,所以地址就是ds*16+bx+0150h=31350h,
ch=88h,所以(31350)=88h,(31351)=3ch
8086組合語言的問題
15樓:
要求太多,分數又太低.你這個沒有寫出記憶體的儲存情況是沒辦法得到cl準確的值.
16樓:就是為了答題
請你把完整的題目寫出來,否則你這個題沒法做
有關8086組合語言的一些問題 50
17樓:茅尹
start:
mov bx, 1234h ;欲求:dx=12*34=0408h
;用 bh 控制迴圈,把 bl 內容累加
;----------------------------mov dx, 0
mov cl, bh
and cl, 0fh ;留下bh的個位mov ch, 0
lp1:
mov al, dl
add al, bl
daamov dl, al
mov al, dh
adc al, 0
daamov dh, al
loop lp1
;----------------------------mov cl, 4
shr bh, cl ;右移四位mov cl, bh ;留下bh的十位mov ch, 0
push cx
mov cl, 4
shl bx, cl
and bx, 0ff0h
pop cx
lp2:
mov al, dl
add al, bl
daamov dl, al
mov al, dh
adc al, bh
daamov dh, al
loop lp2
;----------------------------;執行到此處,即得出:dx=0408h。
18樓:沙裡波特
用原碼進行加減運算,少見!
沒有用的,不用理會它。
組合語言程式設計的問題,組合語言程式設計問題
1.jmp bx 如果 bx 1020h,那麼 ip 1020h,因為此種形式為通過暫存器的段內間接轉移,執行時將把暫存器的內容直接送ip,所以執行此指令後ip的值為1020h 2.jmp tab bx si 如果 ds 2000h,bx 1020h,si 0002h,tab 0010h,21032...
關於組合語言的迴圈問題,關於組合語言中的PUSH問題。
你理解bai從程式上面執行下來到du達 loop s後又去執行標zhi號s處,這沒錯。然dao後就內無限迴圈死,這就錯了容 組合語言的迴圈指令loop是有條件的,這個隱含操作和條件就是每迴圈一次,cx cx 1,如果cx 0,迴圈就結束了。在這個程式中,迴圈3次結束。關於組合語言中的push問題。每...
組合語言中的問題
此處指的是 mov cl,1234 需要4個機器指令週期 非也.指令長度就是指令長度.具體說,就是這句彙編語句翻譯成機器指令後所佔的位元組數.最直觀的莫過於用debug.exe的a命令輸入幾條彙編語句來看看了.執行debug,提示符下打a100回車,依此輸入 mov bx,1000回車,mov ax...