汇编程序—将一个全是字母,以0结尾的字符串,转化为大写
生活随笔
收集整理的這篇文章主要介紹了
汇编程序—将一个全是字母,以0结尾的字符串,转化为大写
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
程序思路
我們有一個現成的指令jcxz 可以判斷cx寄存器中是否0,可以將data段的數據一個一個放到cx中,緊接著調用jcxz指令,如果cx為0 跳出子程序,如果不為0進行大寫轉化!
這里為了方便展示,將轉換前后的字符串都放到屏幕中進行展示,代碼中有一定的注釋。
程序代碼
assume cs:code,ss:stackdata segmentdb 'laymond',0 data ends stack segmentdb 128 dup(0) stack endscode segmentmain:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axcall init_regcall clear_screencall show_1wordmov ax,4c00Hint 21H ;------------------------------ show_1word:mov si,0 ;si 為源字符串的位置mov di,160*10+40*2 ;顯示在第10行中間位置call show_string call to_upper ;si to_upper參數,要轉換字符串的起始位置mov di,160*11+40*2 ;di show_string參數,顯示的地址,將其顯示到下一行call show_string ret ;------------------------------ ;子程序功能 將字符串轉換為大寫 ;參數寄存器 si 轉換字符串的起始地址 to_upper:push cxpush si toUpper:mov cx,0mov cl,ds:[si] jcxz upperRetand byte ptr ds:[si],11011111Binc sijmp toUpper upperRet:pop sipop cxret ;------------------------------ ;子程序功能 顯示指定位置的字符串 ;參數寄存器 si 源字符串的位置 ;參數寄存器 di 字符串顯示的位置 show_string:;將使用到的寄存器變量通過棧保存,使用完畢將可通過彈棧數據還原push axpush cxpush espush dspush dipush simov ax,0B800Hmov es,ax showLetter:mov cx,0mov cl,ds:[si]jcxz showRetmov al,ds:[si] ;內存單元之間不能直接進行賦值!必須借助寄存器mov es:[di],al inc siadd di,2jmp showLetter showRet:pop sipop dipop dspop espop cxpop axret ;------------------------------ init_reg:mov bx,0B800H ;顯存起始位置mov es,bx ret ;------------------------------- clear_screen:mov bx,0mov dx,0700H ;黑底空字符,偶數字節為顯示字符,奇數字節放顯示方式mov cx,2000 ;每頁25行,每行可顯示80個字符,2000個字符,循環2000次 clearScreen:mov es:[bx],dxadd bx,2loop clearScreenretcode endsend main運行結果
題目擴展
如果是多行字符串轉換呢?還是一樣的,由于我們上面寫代碼是按功能寫的子程序,那么進行擴展就非常方便了!
多行字符串代碼
assume cs:code,ss:stackdata segmentdb 'aaaa',0db 'bbbb',0db 'cccc',0db 'dddd',0 data ends stack segmentdb 128 dup(0) stack endscode segmentmain:mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axcall init_regcall clear_screencall show_4wordmov ax,4c00Hint 21H ;------------------------------ show_4word:mov di,160*10+40*2 ;dos顯存 每頁25行 80字符/行,每個字符2個字節,從第10行開始顯示mov si,0mov cx,4 show_word:call show_string call to_uppercall show_UpperStringadd di,160 ;顯示到下一行,每行160字節add si,5 ;si 為to_upper參數 下一個字符串的起始位置loop show_wordret show_UpperString:push diadd di,20 ;di 為show_string參數 將大寫后的字符串顯示到 源字符串的后面call show_string pop diret ;------------------------------ ;子程序功能 將字符串轉換為大寫 ;參數寄存器 si 轉換字符串的起始地址 to_upper:push cxpush si toUpper:mov cx,0mov cl,ds:[si] jcxz upperRetand byte ptr ds:[si],11011111Binc sijmp toUpper upperRet:pop sipop cxret ;------------------------------ ;子程序功能 顯示指定位置的字符串 ;參數寄存器 si 源字符串的位置 ;參數寄存器 di 字符串顯示的位置 show_string:;將使用到的寄存器變量通過棧保存,使用完畢將可通過彈棧數據還原push axpush cxpush espush dspush dipush simov ax,0B800Hmov es,ax showLetter:mov cx,0mov cl,ds:[si]jcxz showRetmov al,ds:[si] ;內存單元之間不能直接進行賦值!必須借助寄存器mov es:[di],al inc siadd di,2jmp showLetter showRet:pop sipop dipop dspop espop cxpop axret ;------------------------------ init_reg:mov bx,0B800H ;顯存起始位置mov es,bx ret ;------------------------------- clear_screen:mov bx,0mov dx,0700H ;黑底空字符,偶數字節為顯示字符,奇數字節放顯示方式mov cx,2000 ;每頁25行,每行可顯示80個字符,2000個字符,循環2000次 clearScreen:mov es:[bx],dxadd bx,2loop clearScreenretcode endsend main多行字符串運行結果
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的汇编程序—将一个全是字母,以0结尾的字符串,转化为大写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一探浮点数
- 下一篇: C++ WINDOWS下 wchar_t