**
一.實驗目的
1、掌握迴圈程式的結構;
2、學習綜合程式的設計、編寫及除錯;
二.實驗內容
1、計算s=12+23+34+。。。+n(n+1);
2、求某個資料區內負數的個數;
三.試驗程式
1、
datas segment
result dw ? ;計算結果
dval db 5 dup(?);申請緩衝區,存放轉換後的資料
dlen =$-result ;位址偏移量
datas ends
codes segment
assume cs:codes,ds:datas
start:
mov dx,0001h
mov bl,02h
a0:
mov al,bl
inc bl
mul bl
add dx,ax ;結果存於dx中
cmp ax,00c8h ;判斷n(n+1)與200的大小
jb a0
mov ax,datas ;儲存計算結果
mov ds,ax
mov result,dx
;16進製制轉10進製輸出
mov si,offset result;資料源位址
mov dx,[si]
mov si,offset dlen;目標資料位址 offset送回偏移位址
a1:
dec si;自減
mov ax,dx
mov dx,0
mov cx,10;除數10
div cx;商送ax,餘數dx
xchg ax,dx;資料交換
mov [si],al;存入目標位址
cmp dx,0000h
jne a1;判斷轉換結束否,未結束轉a1 不等跳轉
a2:
cmp si,offset dval;與目標位址的首址比較
jz a3;等於首位址轉a3,否則將剩餘位址填00h 等0跳轉
dec si
mov al,00h
mov [si],al
jmp a2
a3:
mov cx,5 ;迴圈次數
mov si,offset dval;目標資料位址 offset送回偏移位址
mloop:
mov al,[si];將si位址的數依次賦值給al
inc si
add al,30h ;ascii碼
mov dl,al ;輸出
mov ah,2
int 21h
loop mloop ;迴圈
mov ah,4ch
int 21h
codes ends
end start
2、
datas segment
msg0 db 'number of all nums:$'
msg1 db 10,13,'please input a num:$'
msg2 db 10,13,'number of negative nums is $'
buf dw ?;首單元為總數
result db ? ;統計後的負數個數
datas ends
stacks segment
;此處輸入堆疊段**
stacks ends
codes segment
assume cs:codes,ds:datas,ss:stacks
start:
mov ax,datas
mov ds,ax
lea dx,msg0 ;msg0位址存入dx
mov ah,9 ;顯示字串
int 21h
mov ah,1
int 21h ;輸入資料個數
mov ah,0
sub al,48
mov cx,ax
push cx
mov si,offset buf
again:
lea dx,msg1 ;msg1位址存入dx
mov ah,9 ;顯示字串
int 21h
call input
mov [si],bx
add si,2
loop again
mov di,offset buf ;資料區首位址
pop cx
mov bl,0
a1:
mov ax,[di]
test ax,1000000000000000b ;檢查資料首位是否為1
jz a2
inc bl ;負數個數加1
a2:
add di,2
loop a1
lea dx,msg2 ;msg2位址存入dx
mov ah,9 ;顯示字串
int 21h
mov di,offset result ;存結果
mov [di],bl
add bl,48
mov dl,bl
mov ah,2
int 21h
mov ah,4ch
int 21h ;程式終止
input proc
push ax
push cx
xor bx,bx
xor cx,cx ;置0 bx儲存結果 cx是正負標誌
xor dx,dx
in0:
mov ah,1
int 21h ;輸入
cmp al,'+'
jz in1 ;正數 繼續輸入
cmp al,'-'
jnz in2
mov cx,1 ;負數 cx置1
in1:
mov ah,1 ;繼續輸入
int 21h
in2:
cmp al,'0'
jb in3
cmp al,'9'
ja in3 ;<0 >9 結束
sub al,48
mov ah,0
push ax
mov ax,bx
mov dl,10
imul dx
pop ax
add bx,ax
jmp in1
in3:
cmp cx,0 ;判斷正負數
jz in4
neg bx ;負數求補
in4:
pop cx
pop ax
retinput endp
codes ends
end start
四.試驗中遇到的問題、試驗結果分析
實驗一很簡單!沒有問題!
實驗二求負數個數的一開始沒理解怎麼存進去記憶體,後來問了老師也清楚了!還有就是寫**的時候,如果使用暫存器計數或者什麼,一定要記得置0!!!尤其是你一開始存到al後邊用ax的時候,記得把ah置0!!我就是因為置0的問題,一直輸出不正確,看了**好長時間才發現!!
五.實驗總結與體會
通過本次對迴圈問題的求解,使我更加熟悉了跳轉、迴圈等指令的使用。還結合了前面輸入輸出的內容,溫故知新。使用了新指令:neg。自己寫程式時老是犯一些比較低階的小錯,要注意。
有符號數與無符號數
關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...
有符號數和無符號數
有符號和無符號整數 1.通常情況下,大多數字預設的是有符號數,比如 4,5 要想寫乙個無符號數必須在後面加u 比如 4u,5u 2.在計算機中有符號數是用補碼的形式來表示的,最高位是符號位。無符號數就是正數唄 正數的補碼和原碼相同。比如 1 在計算機中表示為 11111111 11111111 11...
無符號數和有符號數
人有十個手指頭,習慣了逢十進一,於是十進位製成了生活中的標準。程式的世界只有高低電平兩種狀態,更適合用二進位制來表示,於是二進位製成了程式世界的標準。對與無符號數來說,我們更喜歡談他們之間的轉化,十進位制是我們最習慣的進製,於是十進位制轉為r進製,r進製轉為十進位制變尤為重要。十進位制 r進製 整數...