組合語言(王爽)實驗十(3)

2021-10-10 09:42:54 字數 3306 閱讀 6388

答案在最後面

有兩個答案,建議直接看第二個

div bx ;ax/bx ,商存在ax中,餘數存在dx中

add dx,30h ;由題意得要+30h

mov [si],dx ;把該值存到記憶體data segment

mov cx,ax

jcxz k ;用cx判斷是否跳出此迴圈

inc si ;迴圈加一

inc cx ;該步驟非常具有啟發性

;因為loop需要讓cx-1,所以如果cx此時是1的時候

;它就會直接返回了,而不是繼續執行多一次迴圈

;注意,我們在這個步驟需要的是從jcxz處跳出迴圈

loop s

k:pop dx

pop si

pop cx

pop bx

pop ax

retshow_str:

push dx

push cx

push ds

push si

mov ax,0b800h

mov es,ax ;0b800h是用於控制向螢幕輸出的一段記憶體

;一共25*80*2個字

mov al,160 ;每行160個字

mul dh

mov bx,ax

mov al,2 ;每個單元2個字

mul dl

add bx,ax

mov al,cl

skir:

mov cx,[si]

jcxz ok

mov dx,[si]

mov es:[bx],dx ;第乙個字放內容

mov es:[bx+1],al ;第二個字放顏色屬性

inc si

add bx,2

loop skir

ok:pop si

pop ds

pop cx

pop dx

retcode ends

end start

寫到此處,可以將數字逆序輸出,如果需要正序輸出,再寫乙個子程式即可

——————————分割線————————————

補充乙個更好的做法

assume cs:code

data segment

db 10 dup(0)

data ends

code segment

start:mov ax,1266

mov bx,data

mov ds,bx

mov si,0

call dtoc

mov dh,8

mov dl,3

mov cl,2

call show_str

mov ax,4c00h

int 21h

dtoc: ;數值顯示的子程式定義

push dx

push cx

push ax

push si

push bx

mov bx,0

s1: mov cx,10d

mov dx,0

div cx

mov cx,ax

jcxz s2

add dx,30h

push dx ;先存入棧,為的是最後正序輸出

inc bx

jmp short s1 ;使用jmp就不會存在loop減一的問題

s2: add dx,30h

push dx

inc bx ;再進行一次棧操作(補充當"商為零而餘數不為零"時的情況)

mov cx,bx ;此時cx中就儲存了ds:00中的非零數字個數

mov si,0

s3: pop ax

mov [si],al ;從棧中取出來,這時就成為正序了

inc si

loop s3

okay: pop bx

pop si

pop ax

pop cx

pop dx

ret ;數值顯示的子程式定義結束

show_str:

push dx

push cx

push ds

push si

mov ax,0b800h

mov es,ax ;0b800h是用於控制向螢幕輸出的一段記憶體

;一共25*80*2個字

mov al,160 ;每行160個字

mul dh

mov bx,ax

mov al,2 ;每個單元2個字

mul dl

add bx,ax

mov al,cl

skir:

mov cx,[si]

jcxz ok

mov dx,[si]

mov es:[bx],dx ;第乙個字放內容

mov es:[bx+1],al ;第二個字放顏色屬性

inc si

add bx,2

loop skir

ok:pop si

pop ds

pop cx

pop dx

retcode ends

end start

王爽《組合語言》實驗十

實驗十 3.數值顯示 以下程式附帶測試程式 1 名稱 dtoc2 功能 將dword型資料轉變為表示十進位制數的字串,字串以0為結尾3 引數 ax dword型資料低字4 dx dword型資料高字5 ds si指向字串的首位址6 返回 無 7 assume cs code 8data segmen...

組合語言 《組合語言》王爽 實驗一

從 1000 0 開始寫入命令 a 1000 0 mov ax,4e20 add ax,1416 mov bx,2000 add ax,bx mov bx,ax add ax,bx mov ax,001a mov bx,0026 add al,bl add ah,bl add bh,al mov a...

組合語言 王爽 實驗4

這學期在學彙編,沒怎麼自己動手程式設計過,結果到了中期編不出程式來,實在太尷尬了 特此來補各個實驗。4 11 0 200 0 20b 為什麼等同於 0020 0 0020b?0 200 0x16h 200 00200h 所以拆分成不同的形式即可轉換 assume cs code code segme...