20180411第二次實驗總結
[注意⚠️] 1.二進位制目標檔案obj結尾
但是如果想要全部都變為小寫,則需要使用迴圈,不然就只能改變第乙個的大小寫
data segment
buffer db 20,?,21 dup('$')
data ends
code segment
assume cs:code,ds:data
start:
mov ax,seg buffer
mov ds,ax
mov dx,offset buffer
mov ah,10
int 21h
mov buffer[0],0dh
mov buffer[1],0ah
mov ax,seg buffer
mov ds,ax
mov dx,offset buffer
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
複製**
葭葭葭葭葭葭葭 23:55:11
data segment
data ends
code segment
assume cs:code,ds:data
start:
;把es賦值為b800
mov ax,0b800h
mov es,ax
;獲取對應的游標位置(int 10的3號功能為游標位置)
mov bl,0
mov ah,3
mov bh,0
int 10h
;行號儲存在dh中,列號儲存在dl中
;位置=dh*160+dl*2
mov al,160
;將dh與al, 結果放在ax
mul dh
mov dh,0
shl dl,1
add ax,bx
mov bx,ax
;打出 ajiajia
mov al,41h
mov es:[bx+0],al
mov byte ptr es:[bx+1],1eh
mov al,6ah
mov es:[bx+2],al
mov byte ptr es:[bx+3],1eh
mov al,69h
mov es:[bx+4],al
mov byte ptr es:[bx+5],1eh
mov al,61h
mov es:[bx+6],al
mov byte ptr es:[bx+7],1eh
mov al,6ah
mov es:[bx+8],al
mov byte ptr es:[bx+9],1eh
mov al,69h
mov es:[bx+10],al
mov byte ptr es:[bx+11],1eh
mov al,61h
mov es:[bx+12],al
mov byte ptr es:[bx+13],1eh
code ends
end start
複製**
區分舉例:十進位制數 9和15
非壓縮bcd碼
解法一:我最開始的做法,但輸出超過兩位數就發生了錯誤
data segment
mess db 'y=2x+3,please input x : $'
show db 'y=2x+3= $'
data ends
code segment
assume cs:code,ds:data
start:
; 將資料端的段位址賦給ds
mov ax,data
mov ds,ax
;提示資訊的顯示
mov dx,offset mess
mov ah,9
int 21h
;鍵盤輸入 輸入後的值放在al中
mov ah,1
int 21h
sub al,30h ;去掉ascii碼
mov ah,0 ;防止對資料結果造成影響
shl al,1 ;乘2後的結果就放在al中
add al,3 ;加3
mov bl,al ;儲存資料
add bl,30h ;加上ascii碼
;顯示「y=2x+3=」,在此之前加入回車換行
mov ah,2
mov dl,0ah
int 21h ;換行
mov dx,offset show
mov ah,9
int 21h
;輸出結果
mov ah,2 ;這句話必須有,不然會出現很多奇怪的
mov dl,bl
int 21h
mov ah,4ch
int 21h
code ends
end start
複製**
實現效果:
解法二:運用aam,結果是一位數的時候是正常的,但是當結果是兩位數的時候,比如輸入 4 應該輸出 11 ,但結果就開始亂了
複製**
實現效果:
mess2 db 0ah,0dh,'y=2x+3=$'
複製**
由於非壓縮的bcd碼用乙個位元組表示乙個十進位制數,調整後若加上30h 就是該數值的ascii碼
所以aaa的含義為加法執行後可以調整為ascii
data segment
mess db 'y=2x+3,please input x : $'
show db 'y=2x+3= $'
data ends
code segment
assume cs:code,ds:data
start:
;將資料端的段位址賦給ds
mov ax,data
mov ds,ax
;提示資訊的顯示
mov dx,offset mess
mov ah,9
int 21h
;鍵盤輸入 輸入後的值放在al中
mov ah,1
int 21h
sub al,30h ;去掉ascii碼
mov ah,0 ;防止對資料結果造成影響
shl al,1 ;乘2後的結果就放在al中
aamadd ax,3h ;加3
aaaadd ax,3030h ;加上ascii碼
mov bx,ax ;儲存資料
;顯示「y=2x+3=」,在此之前加入回車換行
mov ah,2
mov dl,0dh ;回車
int 21h
mov dl,0ah
int 21h ;換行
mov dx,offset show
mov ah,9
int 21h
;輸出結果
mov ah,2
mov dl,bh
int 21h
mov dl,bl
int 21h
mov ah,4ch
int 21h
code ends
end start
複製**
實現效果如下
1.如果要寫十六進製制的,就需要帶著h。這裡的加3,寫為 add ax,3h 可行,寫為 add ax,3 仍舊可行的原因是 :3和3h在ascii表上表示的是同乙個字元,但是 33可和33h不一樣了啊
二 順序程式設計
1 空語句 空語句什麼也不執行,相當於乙個回車 2 用到輸入輸出時需要加 include printf和scanf除外 3 putchar 字元輸出函式 例 putchar a 輸出a putchar 101 輸出a 使用時必須加標頭檔案 include 4 getchar 鍵盤輸入函式 例 cha...
彙編學習 二
如果要能編譯和執行asm檔案,則必須安裝masmsdk2.建立visual c 空白工程 3.新建asm檔案 這是網上摘錄的 mymain.asm.386 model flat,stdcall option casemap none include windows.inc include kerne...
彙編學習 二
1.jmp 改變eip的值。最大區別 會改變esp 棧頂 1.cmp指令 該指令是比較兩個運算元,實際上,它相當於sub指令,但是相減的結構並不儲存到第乙個運算元中。只是根據相減的結果來改變零標誌位的,當兩個運算元相等的時候,零標誌位置1。可以用來判斷兩個數是否相等 cmp eax,eax 看zf,...