80x86組合語言程式設計 用游標鍵控制字串的移動

2021-07-09 15:03:00 字數 3528 閱讀 8846

;程式執行後,提示輸入字串(字元數大於5個)。

;按右移鍵則字元以一定速率向右移動,移到右邊則字元再從左邊出來。

;按左移鍵,則字元向左移動,再從右邊出來.行號不變。

;;做而論道編寫的程式如下。

;***********************************

assume   cs:cc, ds:qw

;-----------------------------------

qw  segment

str   db  81  dup (20h)

in_b  db  20, ?, 20 dup (?)

fh    db  0

tip1  db  'please input a string : $'

tip2  db  13, 10, 'you can press keys : '

db  27, 26, ' change direction,'

db  24, 25, ' change speed,  esc  exit. $'

dl_x  dw  800      ;控制移動速度

max   equ   3600       ;越大移動越慢

min   equ   200        ;越小移動越快

qw  ends

;-----------------------------------

cc  segment

s_t:

mov   ax, qw

mov   ds, ax

mov   ax, 0b800h

mov   es, ax

;-------------------------

lea   dx, tip1

mov   ah, 9

int   21h

lea   dx, in_b

mov   ah, 10

int   21h

mov   bl, in_b + 1

cmp   bl, 5

ja    go_on     ;多於5個,就繼續

jmp   exit      ;不足,則退出

go_on:

mov   bh, 0

lea   dx, tip2

mov   ah, 9

int   21h

mov   cx, bx

mov   si, 0

lp1:

mov   al, in_b[si + 2]

mov   str[si], al

inc   si

loop  lp1

m_loop:

call  disp_str

call  delay

mov   ah, 1      ;

int   16h        ;僅讀狀態

jz    yids       ;為零就是沒有按

mov   ah, 0      ;按下則再讀

int   16h        ;ah=掃瞄碼,al=ascii碼

cmp   al, 27

je    exit

cmp   ah, 48h    ;

je    up

cmp   ah, 50h

je    dn

cmp   ah, 4bh

je    zl

cmp   ah, 4dh

je    zr

jmp   yids       ;轉去移動

;----------------------------------

up:cmp   dl_x, min

jb    yids

sub   dl_x, 100

jmp   yids

dn:cmp   dl_x, max

ja    yids

add   dl_x, 100

jmp   yids

zr: mov   fh, 0      ;改變方向

jmp   yids

zl: mov   fh, 1

yids:                ;移動

test  fh, 1      ;判別方向

je    rrr

call  l_shift

jmp   m_loop

rrr:

call  r_shift

jmp   m_loop

;---------------------------

exit:

mov   ah, 4ch

int   21h

;-----------------------------------

delay:

push  dx

push  cx

mov   dx, dl_x

mov   cx, 0

dl_lp1:

nopnop

loop  dl_lp1

dec   dx

jnz   dl_lp1

pop   cx

pop   dx

ret;-----------------------------------

disp_str:

mov   si, 0

mov   di, 0

mov   ah, 4eh

mov   cx, 80

lp2:

mov   al, str[si]

mov   es:[di + 12 * 160], ax

inc   si

add   di, 2

loop  lp2

ret;-----------------------------------

r_shift:

mov   si, 79

mov   cx, 80

rs_loop:

mov   al, str[si]

mov   str[si + 1], al

dec   si

loop  rs_loop

mov   al, str[80]

mov   str[0], al

ret;-----------------------------------

l_shift:

mov   si, 0

mov   al, str[0]

mov   str[80], al

mov   cx, 80

ls_loop:

mov   al, str[si + 1]

mov   str[si], al

inc   si

loop  ls_loop

ret;-----------------------------------

cc  ends

end   s_t

;***********************************

以上程式經過編譯、連線、執行後,顯示的截圖如下:

在主頁的頁面,可以看到這篇文章已經插圖了,但是,開啟本頁面,卻不顯示插圖。

80x86組合語言 分類統計

組合語言的程式設計題!急 有100個學生成績,存放在以data為首址的位元組儲存單元中。試統計其中90 含90 以上的人數,60 90 含60 之間的人數,60以下的人數,分別存入max,middle,min三個變數中。15 分鐘前 做而論道 十七級 最快回答 assume ds qq,cs cc ...

組合語言 80x86定址方式

1 立即定址方式 立即定址方式中指令的運算元是8位或16位立即數,並直接出現在指令中。例如 mov al,10h 源運算元為立即定址 執行後al 10h mov ax,0a48h 源運算元為立即定址 執行後ax 0a48h 立即定址只能用於源運算元,不能用於目的運算元。2 暫存器定址方式 暫存器定址...

80x86組合語言程式設計P50

386 stack segment use32 db 200 dup 0 stack ends con equ 500 data segment use16 a dw m buf db ab 0dh,0ah b dw 0ffaah d dd buf m db 2 dup 1 2 dup 2,b 12...