+ -
当前位置:首页 → 问答吧 → 请教汇编两题

请教汇编两题

时间:2011-11-03

来源:互联网

Assembly code
data segment
 str1 dw 0ah,0dh,'input a letter'
 str2 dw 0ah,0dh,'wrong data'
 str3 dw 0ah,0dh,'no,guide'
 str4 dw 0ah,0dh,'no,follow-up'
data ends
code segment
assume cs:code,ds:data
start:
  lea dx,str1
  mov ah,09h
  int 21h

  mov ah,01h
  int 21h

  cmp al,61h
  jl lop1
  jz lop2

  cmp al,7ah
  ja lop3
  jz lop4
  jmp lst
lop1:
  lea dx,str2
  mov ah,09h
  int 21h
  jmp last
lop2:
  lea dx,str3
  mov ah,09h
  int 21h

  mov dl,al
  mov ah,02h
  int 21h

  mov dl,al+1
  mov ah,02h
  int 21h

  jmp last
lop3:
  lea dx,str2
  mov ah,09h
  int 21h
  jmp last
lop4:
  lea dx,str4
  mov ah,09h
  int 21h

  mov dl,al-1
  mov ah,02h
  int 21h

  mov dl,al
  mov ah,02h
  int 21h
 jmp last
lst:
  mov dl,al-1
  mov ah,02h
  int 21h

  mov dl,al
  mov ah,02h
  int 21h

  mov dl,al+1
  mov ah,02h
  int 21h
  jmp last
last:
  mov ah,4ch
  int 21h
code ends
 end start
 

二:Assembly code
data segment
 str1 db 'positive number:$',0ah,0dh
 str2 db 0ah,0dh, 'minus number:$'
 num dw 1,2,-8,4,-6,-5,-4,-3,11,12,57,33,14,12,45,11,-22,-3,-13,41
 count dw ?
data ends
code segment 
  assume cs:code,ds:data
start:
  mov ax,data
  mov ds,ax
  mov cl,0
  mov si,0
  mov count,0
lop:
  inc count
  mov ax,num[si]
  cmp ax,0
  jg clp
  inc si
  cmp count,20
  jz last  
  jmp lop
clp:
  inc cl
last:
 lea dx,str1
 mov ah,09h
 int 21h

 add cl,30h
 mov dl,cl
 mov ah,02h
 int 21h

 lea dx,str2
 mov ah,09h
 int 21h

 mov bl,20
 sub bl,cl
 mov dl,bl
 mov ah,02h
 int 21h

 mov ah,4ch
 int 21h
code ends 
 end start


以上两题第一题是输入一个字符判断并输出这个字符的前导字符和后续字符
第二题是求一个数组中正负数的个数 结果有错 大家抽空看看 谢了

作者: zp032420   发布时间: 2011-11-03

引用楼主 zp032420 的回复:
Assembly code

data segment

第二题供参考:
Assembly code

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;题目2、Array开始存放着20个带符号的数(自己定),
;分别统计负数、0、正数的个数,并分别存入到intA、intB、intC存储单元中。
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    TITLE 'No 2'
    NAME myProg
    PAGE 55, 132

data segment
    Array dw -1, 0, 3, -4, 9, -8, 0, 56,  9, 4
          dw 7 , 0, 3, -9, 0, -6, 0,  8, -8, 4
          
    intA dw 0 ;记正数个数
    intB dw 0 ;记0的个数
    intC dw 0 ;记负数的个数

    sAscii db 6 dup(?) ;用来存放转换的十进制数字串
    
    Msg1 db 0dh,0ah, ' Positive number = $'
    Msg2 db 0dh,0ah, ' Zero = $'
    Msg3 db 0dh,0ah, ' Negative number = $'
    newline db 0dh,0ah,'$' ;回车换行
    
data ends

stack segment stack 'stack'
    dw 32 dup(?)
stack ends
;=====================================================================
;代码段
;=====================================================================
code segment
    assume ss:stack,cs:code,ds:data
start:
    mov ax,data ;设置ds寄存器,使其指向data段
    mov ds,ax   ;
    
    mov si,offset Array ;装入数组的首地址
    mov cx,20           ;设置循环记数器,使其标识有20个项
    
    ;使用一个循环,逐个扫描数组每一项,并查验该项是正?还是负?还是0?并分类记数
    getNext:
        mov ax, [si] ;取数组的项
        or ax,ax     ;该指令会修改SF,OF标志寄存器,以此来作为判断的依据
                     ;也可以用cmp ax,0 ,或者test ax,ax
        ;cmp ax,0
        ;test ax,ax
        je addM2    ;ax为0 跳转到记0的子程序
        jg addM1    ;ax大于0,跳转到记正数的子程序
        inc intC    ;否则,记负数的变量增加1
        jmp bottom  ;

        addM2:
            inc intB ;
            jmp bottom
        addM1:
            inc intA
        bottom:    
            add si,2   ;修改指针,指向下一个项(每项占两个字节哟)
    loop getNext       ;让记数器cx自动减1,如果不为零就进入下一循环
    ;------------------------------------------------------
    ;输出(根据题意输出这段可以不要,到此已可直接退出了):
     mov ax,4c00h
    int 21h
end start



作者: gsy999   发布时间: 2011-11-03