发新话题
打印

[原创]汇编语言程序设计简单的上机考试总结

[原创]汇编语言程序设计简单的上机考试总结

文章作者:冰血封情[EST]
信息来源:邪恶八进制 中国(www.EvilOctal.com

注意:本文是冰血封情对一个简单的ASM机试总结 没什么技术难度 很适合菜鸟看

刚刚考完IBMPC汇编语言程序设计 考试挺简单的 但是也得做个总结 因为中间被老师刁难了一下 不爽她
本次机试考了两道题目 就第一道题目来总结一下(因为她刁难我的就是这题目)

题目要求:
用IBMPC80x86汇编语言简单实现一个小程序 其作用是 让用户从键盘上输入一串字符 然后程序接受这些字符后统计里面非数字的字符个数 然后将结果显示出来

很简单的考试题目 是人都会 平时实验做过一个类似的 于是自然想偷懒了 人不偷懒天诛地灭呀 于是我一开始把程序写成这样(去过我blog的人都知道 这就是我以前做过分析的程序)
代码如下:
复制内容到剪贴板
代码:
;PROGRAM TITLE GOES HERE -- COUNT_CHAR
;*****************************************************************************
data segment                ;define data segment
letter       db      0     ;define letter A-->Z a-->z
digit        db      0     ;define digit 0-->9
other        db      0     ;define other char
data ends                  ;data segment end
;*****************************************************************************
code segment                     ;define code segment
;-----------------------------------------------------------------------------
main   proc    far                  ;begin of main part of program
     assume cs:code,ds:data
start:                           ;start the execution address
     mov   letter,0
     mov   digit,0
     mov   other,0
input:
     mov   ah,01h                 ;input char
     int   21h                   ;call cmd command
     cmp   al,0dh                 ;if enter
     jz    exit                  ;then exit
     cmp   al,'A'                 ;compare it to A
     jb    l1                    ;if <A jump to l1
     cmp   al,&#39;Z&#39;                 ;compare it to Z
     ja    hello                  ;if >Z jump to hello
     inc   letter                 ;A----->Z
     jmp   input                  ;jump to input
l1:
     cmp   al,&#39;0&#39;                 ;compare it to 0
     jb    oth                   ;if <0 jump to oth
     cmp   al,&#39;9&#39;                 ;compare it to 9
     ja    oth                   ;if >9 <A jump to oth
     inc   digit                  ;0----->9
     jmp   input                  ;jump to input
hello:
     cmp   al,&#39;a&#39;                 ;compare it to a
     jb    oth                   ;if >Z <a jump to oth
     cmp   al,&#39;z&#39;                 ;compare it to z
     ja    oth                   ;if >z jump to oth
     inc   letter                 ;a----->z
     jmp   input                  ;jump to input
oth:
     inc   other                  ;other is char
     jmp   input                  ;jump to input
exit:
     mov   ah,4ch                 ;return to exit
     int   21h                   ;call cmd command
     ret                        ;return to DOS
main   endp                       ;end of main part of program
;-----------------------------------------------------------------------------
code ends                         ;end of code segment
;*****************************************************************************
     end   start                  ;end assembly
然后自然是臭美的让老师检查 其实这种程序很简单 没什么好臭美的 但谁让偶是一ASM初学者呢?
这个程序编译通过后(编译过程我就不说了 不是重点) 是用Debug运行的...如下:
引用:
Debug char.exe<回车呀>
-g<回车呀>
www1111@@@@@<回车呀>
-d0<回车呀>
这里debug会从开头开始查看程序 前三个数字分别是
03 04 05
就是按照程序中
复制内容到剪贴板
代码:
letter       db      0     ;define letter A-->Z a-->z
digit        db      0     ;define digit 0-->9
other        db      0     ;define other char
的顺序统计你输入的数字...
老师来后 我告诉她 03就是前面我输入的字母个数 而05是我前面输入的符号个数
他们加起来就是 非数字的个数了 3+5=8
但是老师非要我把8这个数字弄出来给她看 否则是不算通过:(
没办法...来吧 其实很简单 把程序修改一下就好了...
这里我来介绍一下原来程序的骨干流程:
其实原来的程序是这样的 首先我声明用
复制内容到剪贴板
代码:
letter       db      0     ;define letter A-->Z a-->z
digit        db      0     ;define digit 0-->9
other        db      0     ;define other char
分别用于存放字母 数字和符号 然后程序开始 把这三个数值先变成0 这不是多余的步骤 如果不这样 鬼知道计算机给它什么值 这样方便一点点加
复制内容到剪贴板
代码:
     mov   letter,0
     mov   digit,0
     mov   other,0
这里是输入部分
复制内容到剪贴板
代码:
     mov   ah,01h                 ;input char
     int   21h                   ;call cmd command
首先判断是不是回车 如果第一个就是回车 那么退出
复制内容到剪贴板
代码:
     cmp   al,0dh                 ;if enter
     jz    exit                  ;then exit
然后跟A比较 如果小于则送到l1 和Z比较大与则送到hello 剩下的全部送字符
其实我的程序注释很清晰的
复制内容到剪贴板
代码:
     cmp   al,&#39;A&#39;                 ;compare it to A
     jb    l1                    ;if <A jump to l1
     cmp   al,&#39;Z&#39;                 ;compare it to Z
     ja    hello                  ;if >Z jump to hello
     inc   letter                 ;A----->Z
大同小异 l1是判断是否是数字 如果不是就送oth
hello是看是不是小写字母 是就写入letter 不是也送oth
而oth 则把不是字母和数字的东东(当然是符号了)送到other 完成程序...
现在要修改的很简单 就是把不是数字的全送到另外一个地方就OK 程序修改如下:
(这年头 程序越来短 真不愧是偷懒的初学者)
复制内容到剪贴板
代码:
;PROGRAM TITLE GOES HERE -- COUNT_CHAR
;*****************************************************************************
data segment                ;define data segment
digit        db      0     ;define digit 0-->9
other        db      0     ;define other char
data ends                  ;data segment end
;*****************************************************************************
code segment                     ;define code segment
;-----------------------------------------------------------------------------
main   proc    far                  ;begin of main part of program
     assume cs:code,ds:data
start:                           ;start the execution address
     mov   digit,0
     mov   other,0
input:
     mov   ah,01h                 ;input char
     int   21h                   ;call cmd command
     cmp   al,0dh                 ;if enter
     jz    exit                  ;then exit
     cmp   al,&#39;0&#39;                 ;compare it to 0
     jb    oth                   ;if <0 jump to oth
     cmp   al,&#39;9&#39;                 ;compare it to 9
     ja    oth                   ;if >9jump to oth
     inc   digit                  ;0----->9
     jmp   input                  ;jump to input
oth:
     inc   other                  ;other is char
     jmp   input                  ;jump to input
exit:
     mov   ah,4ch                 ;return to exit
     int   21h                   ;call cmd command
     ret                        ;return to DOS
main   endp                       ;end of main part of program
;-----------------------------------------------------------------------------
code ends                         ;end of code segment
;*****************************************************************************
     end   start                  ;end assembly
嘿嘿 经过测试 抓图如下

OK让老师来检查吧...当然Pass了...

本次考试的内容比较简单 但是ASM对于我来说还是一条很艰难的路 要想真的把它学扎实 学校的狗屁课程和书是根本不够的 更别指望靠那些老师:(
以后任何一个汇编程序 一定要弄到每行都明白是什么意思 否则 我决不罢休!
感谢各位听我唠叨:)
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

跟一贴
把我的考试题目也贴出来
题目是这样的:查找匹配字符串
要求:程序接受用户的一个关健字以及一个句子.如果句子中不包含关键字则显示&#39;No match!&#39;;如果句子中包含关键字则显示&#39;Match&#39;.代码如下:
复制内容到剪贴板
代码:
data segment
str1 db 80,?,80 dup(?)
str2 db 80,?,80 dup(?)
hlo1 db 13,10,&#39;enter ketword:$&#39;
hlo2 db 13,10,&#39;enter sentence:$&#39;
mes1 db 13,10,&#39;match at location:$&#39;
mes2 db 13,10,&#39;no match!$&#39;
mes3 db &#39;h of the sentence,$&#39;
tab db &#39;0123456789abcdef&#39;
data ends
prog segment
main proc far
    assume cs:prog,ds:data,es:data
start:push ds
    mov ax,0
    push ax
    mov ax,data
    mov ds,ax
    mov es,ax
next:lea dx,hlo1
    mov ah,9
    int 21h
    lea dx,str1
    mov ah,10
    int 21h
    lea dx,hlo2
    mov ah,9
    int 21h
    lea dx,str2
    mov ah,10
    int 21h  
    mov al,str2+1
    sub al,str1+1
    inc al
    mov bl,al
    mov bh,1
    lea si,str2+2
    mov dx,si
    cld
    mov ah,1
find:mov si,dx
    lea di,str1+2
    mov cl,str1+1
    repz cmpsb
    jz math
    inc dx
    inc bh
    dec bl
    jnz find
nmth:lea dx,mes2
    mov ah,9
    int 21h
    jmp next
    ret
math:lea dx,mes1
    mov ah,9
    int 21h
    mov al,bh
    and al,0f0h
    mov cl,4  
    shr al,cl
    mov ah,0
    mov si,ax
    mov dl,tab[si]
    mov ah,2
    int 21h
    mov al,bh
    and al,0fh
    mov ah,0
    mov si,ax
    mov dl,tab[si]
    mov ah,2
    int 21h
    lea dx,mes3
    mov ah,9
    int 21h
    jmp next
    ret
main endp
prog ends
    end start
谁再说我是流氓豆,我就对谁耍流氓。

TOP

让我这个菜鸟也来跟一把:)
我这个学期才刚学汇编,今天老师安排上机,遇到了一个小问题(对大家来说的了),对于我这个菜鸟可怜得却要熬夜来解决:(
为了解决上机问题,熬夜到现在,大家说我可怜不可怜:(
题目:
从键盘上输入0~9之间的任意一个数字,利用查表的方法计算其平方值,并将计算的结果在显示器上显示出来。
① 以十进制形式输出;
以下是我 熬夜弄出来的代码:
复制内容到剪贴板
代码:
SSEG SEGMENT
STK DB 20 DUP(0)
SSEG ENDS
DSEG SEGMENT
HATAB DB 0,1,2,3,4,5,6,7,8,9
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,SS:SSEG
ASSUME DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV AX,SSEG
MOV SS,AX
MOV SP,SIZE STK
MOV AH,01H
INT 21H
SUB AL,30H
LEA BX,HATAB
XLAT
MUL AL
MOV CL,10
DIV CL
ADD AX,3030H
PUSH AX
MOV DL,AL
MOV BL,02H
INT 21H
POP AX
MOV DL,AH
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
不过还有点小问题就是光标没有移动,导致结果数据被覆盖啦(因为还没有学校什么调转命令),不过在DEBUG下看到结果已经是正确的了!
垃圾一个,00...

TOP

说实话,偶学的时候都在睡觉和旷课了!
益友网吧联盟  http://www.96-7.com

TOP

在发一次垃圾帖,冰血看到了别生气哦:),利用icefox的话,占个版面:)
今天,解决了光标不移动问题,解决办法就是利用串输出,这样就不用移动什么光标:)
DOS功能调用,TMD,我不熟悉:(
复制内容到剪贴板
代码:
SSEG SEGMENT
STK DB 20 DUP(0)
SSEG ENDS
DSEG SEGMENT
string1 db 0,0,&#39;$&#39;
HATAB DB 0,1,2,3,4,5,6,7,8,9
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,SS:SSEG
ASSUME DS:DSEG
START:
MOV AX,DSEG
MOV DS,AX
MOV AX,SSE
MOV SS,AX
MOV SP,SIZE STK
MOV AH,01H
INT 21H
SUB AL,30H
LEA BX,HATAB
XLAT
MUL AL
MOV CL,10
DIV CL
ADD AX,3030H
PUSH AX
MOV DS:[string1],al
MOV DS:[string1+1],ah
LEA DX,string1
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
垃圾一个,00...

TOP

今天又看到这帖子了
呵呵!sunlion[EST]再次在这里发一下我的垃圾帖,呵呵!
上面我跟的第一帖,不知道大家看了没有!呵呵,其实后来我看后发现错误相当的明显,那为什么那个时候我却看不出来呢?
呵呵
大家看到这里了吗?
PUSH AX  ;这里开始压栈
MOV DL,AL
MOV BL,02H  ;这里错误就在这里啦呵呵!我提示你难道你还没看出来吗?:)
INT 21H
POP AX
MOV DL,AH
MOV AH,02H
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
呵呵
,大家看到了吗?我调用到了dos的2号功能键,但是却放错了地方,哈哈,多么明显的错误啊!呵呵,正确的是要把功能键数值放到AH的寄存器中拉:)
!呵呵!大家别K我哦!:)呵呵
修改一下就是这样啦
MOV AH 2
这样就没有错啦!
呵呵
汇编也快学完了,快要考试了:(
垃圾一个,00...

TOP

你们真好 我们还要通过com直接对硬件扳子编程 ,可恶的是硬件电路板还要先自己装。

555555555~~~
欢迎2008!

TOP

尽管这样 我还是很害怕单片机这种东西
qq310926是我唯一用号,除此之外有其他号码号自称邪八冰血封情,则非本人。

TOP

发新话题