匯編語言(王爽)實驗十


實驗要求:

在屏幕的8行3列,用綠色顯示data段中的字符串。

data段的數據: ‘welcome to masm!’,0

實驗分析:

 

建立在實驗九的基礎上。

定位:8行3列。

輸出:只能輸出welcome to masm!

寄存器太多,不能重用。

 

解決第一個問題:di為屏幕上的位置。dh存的行,dl存的是列

解決第二個問題:loop循環退出的條件是cx寄存器為0

把data段傳入cx。如果是0。退出。

 1 assume cs:code
2 data segment
3 db 'Welcome to masm!',0
4 data ends
5
6 code segment
7 start:
8 mov dh,8
9 mov dl,3
10 mov cl,2
11 mov ax,data
12 mov ds,ax
13 mov si,0
14 call show_str
15
16 mov ax,4c00h
17 int 21h
18 show_str:
19 mov bx,cx
20
21 mov ax,data
22 mov ds,ax
23
24 mov ax,0b800h
25 mov es,ax
26
27 mov al,160
28 mul dh
29
30 add dl,dl
31 mov cl,dl
32 mov ch,0
33
34 add ax,cx
35 mov di,ax
36
37
38 s:
39 mov ch,0
40 mov cl,ds:[si]
41 jcxz brk
42 mov al,ds:[si]
43 mov ah,bl
44 mov es:[di],ax
45 inc di
46 inc di
47 inc si
48 loop s
49
50
51 brk:
52 ret
53
54 code ends
55 end start

 

 

 實驗雖然很簡單。但是我做了一個小時。

我愛學習!我不愛玩狼人殺

-----分割線-----上文編輯於----------

------------------------------------------------------------

2.解決除法溢出的問題

實驗要求:

進行不會溢出的乘法運算。舉例:F4240H/0AH

實驗設計:

①將高16位先除除數0AH。商和余數壓入棧中。

②取出余數,將余數先乘16^3,除0AH。將商壓入棧中。將余數乘16,除0AH,將商壓入棧中。

為何要這樣處理?因為無法直接將高十六位的余數乘以16^4,會溢出。所以分兩步處理。

③將第二步的余數與低十六位相加。與0AH進行運算。得到商和余數。

但是第三步有欠妥當的地方。不知道低十六位加上第二步的余數是否會溢出。在本例中不會溢出。實際上應慎重處理。

第三步余數就是最終結果的余數。

④把壓入棧的商都一一取出。恢復進制。

assume cs:code
code segment
start:
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divw
mov ax,4c00h
int 21h
divw:
mov bx,ax
mov ax,dx
mov dx,
0
div cx

push ax
push cx
push dx

pop ax
mov cx,
3
s:
mov di,
16
mul di
loop s

pop cx
div cx
push ax
push dx

pop ax
mov di,
16
mul di
div cx
push ax

mov ax,bx
add ax,dx
mov dx,
0
div cx
mov cx,dx

mov bx,ax
pop ax
add bx,ax
pop ax
mov di,
16
mul di
add ax,bx
pop dx

ret
code ends
end start

實驗結果:

除法運算

AX

DX

1

0001H

0005H

2

0800H

0000H

3

0000H

0000H

4

06a0H

0000H

最后的結果:

AX=86A0H

DX=0001H

CX=0000H

 

 

3.數據顯示

實驗要求:

編程,將數據12666以十進制的形式在屏幕的83列,用綠色顯示出來。

數據寫入:

 

逆序存放:

逆序存放的代碼:

 

我有點疑惑,為什么逆序之后竟然多了一個6

 

我假裝沒有看到這個小bug

結果導向,實驗輸出符合要求。

 

assume cs:code
data segment
db
10 dup(0)
data ends
code segment
start:
mov ax,
12666
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

dtoc:
mov cx,ax
mov si,
0
mov bx,
10
mov dx,
0
s:

div bx
add dx,30H
mov ds:[si],dx
inc si
mov cx,ax
mov dx,
0
inc cx
loop s

mov cx,si
mov si,
0

psh:
mov ax,ds:[si]
push ax
inc si
loop psh

mov cx,si
mov si,
0
pp:
pop ax
mov ds:[si],ax
inc si
loop pp
ret

show_str:
mov bx,cx


mov ax,0b800h
mov es,ax

mov al,
160
mul dh

add dl,dl
mov cl,dl
mov ch,
0

add ax,cx
mov di,ax




mov cx,si
mov si,
0

s1:
mov al,ds:[si]
mov ah,bl
mov es:[di],ax
inc di
inc di
inc si

loop s1

ret
code ends
end start

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: