+ -
当前位置:首页 → 问答吧 → 各位帮帮忙 看看汇编代码对不对或者该怎么做 = =

各位帮帮忙 看看汇编代码对不对或者该怎么做 = =

时间:2011-11-30

来源:互联网

do mo a ri ga do

第一个 从0500H这个单元起的1000个数,找出最小的,放入1000H中
Assembly code

[size=18px]
DATAS SEGMENT
   
DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START PROC FAR
    PUSH DS
    MOV AX,0
    PUSH AX
    MOV AX,DATAS
    MOV DS,AX
    MOV BX,OFFSET 0500H
    MOV CX,999
    MOV AL,[BX]
AGAIN:
    INC BX
    CMP AL,[BX]
    JLE NEXT
    MOV AL,[BX]
NEXT:
    DEC CX
    JNZ AGAIN
    MOV BX,OFFSET 1000H
    MOV [BX],AL
    RET
START ENDP
    CODES ENDS
    END START
[/size]





第二个 以“#”(要求是以空格开头,我不知道怎么做>_<)开头,以“$”结尾的一个串,要求统计中间字符的个数
Assembly code

[size=18px]
DATAS SEGMENT
    STRING DB '#','1','2','3','$' 
DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    LEA BX,STRING
    MOV CX,0
AGAIN:
    INC BX
    MOV AL,[BX]
    CMP AL,'$'
    JNZ NEXT
    JMP EXIT
NEXT:
    INC CX
    JMP AGAIN
EXIT:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

[/size]


第三个 两个多字节的数相加,NUMBER的第一个单元放字节的个数,接着第一个多字节数,第二个多字节数,相加的结果放在第二个多字节数的后面 >_<

Assembly code

[size=18px]
DATAS SEGMENT
   NUMBER DB 8,01H,02H,03H,04H,01H,02H,03H,04H
   COUNT DB ? 
DATAS ENDS

STACKS SEGMENT

STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV BX,OFFSET NUMBER
    MOV AX,[BX]
    MOV BP,AX
    MOV COUNT,AL
    MOV DI,OFFSET NUMBER+[BP]+1
    DIV CL
    MOV BP,AX
    MOV SI,OFFSET NUMBER+[BP]
    AGAIN:
    MOV AL,[SI]
    MOV [DI],AL
    INC DI
    INC SI
    DEC CL
    JNZ AGAIN
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
[/size]


作者: sanjiuailuoluo   发布时间: 2011-11-30

是不是有不对,将源程序汇编链接生成可执行程序,运行下,或在调试软件里走下,看看结果是不是预想的那样。

作者: zara   发布时间: 2011-11-30

引用楼主 sanjiuailuoluo 的回复:
do mo a ri ga do 
第一个 从0500H这个单元起的1000个数,找出最小的,放入1000H中
Assembly code
[size=18px]
DATAS SEGMENT
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
  ASSUME CS:CODES,DS:D……

(1)-------------
Assembly code
;第一个 从0500H这个单元起的1000个数,找出最小的,放入1000H中

DATAS SEGMENT
    org 500h ;将下面的array定位在数据段的这个位置
    array db 1000 dup(0)
    org 1000h ;将下面的array定位在数据段的这个位置
    min    db ?
DATAS ENDS

STACKS SEGMENT para stack 'STACK'
    db 128 dup(0)
STACKS ENDS

CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
START PROC FAR
        PUSH DS
        MOV AX,0
        PUSH AX
        
        MOV AX,DATAS
        MOV DS,AX
        
        ;mov bx,offset array
        ;or mov bx,500h
        MOV BX,OFFSET 0500H
        
        MOV CX,999
        MOV AL,[BX]
AGAIN:
        INC BX
        CMP AL,[BX]
        JLE NEXT      ;你这样设置是默认array是带符号的整数数组
        MOV AL,[BX]
NEXT:
        ;DEC CX
        ;JNZ AGAIN
        loop AGAIN
        
        ;MOV BX,OFFSET 1000H
        ;MOV [BX],AL
        MOV ds:[1000h],AL
        RET
START ENDP
    CODES ENDS
    END START


(2)--------------------
Assembly code
;第二个 以“#”(要求是以空格开头,我不知道怎么做>_<)开头,以“$”结尾的一个串,要求统计中间字符的个数

DATAS SEGMENT
    STRING DB ' ','1','2','3','$' 
    count dw 0
DATAS ENDS

STACKS SEGMENT para stack 'STACK'
    db 128 dup(0)
STACKS ENDS

CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
        MOV AX,DATAS
        MOV DS,AX
        
        LEA BX,STRING
        mov al,[bx]
        cmp al,' '
        jnz EXIT
        
        MOV CX,0
AGAIN:
        INC BX
        MOV AL,[BX]
        CMP AL,'$'
        JNZ NEXT
        JMP EXIT
NEXT:
        INC CX
        JMP AGAIN
        mov [count],cx
EXIT:
        MOV AH,4CH
        INT 21H
CODES ENDS
    END START


(3)--------------------
Assembly code
DATAS SEGMENT
   NUMBER DB 8,01H,02H,03H,04H,01H,02H,03H,04H
   COUNT DB ? 
DATAS ENDS

STACKS SEGMENT para stack 'STACK'
    db 128 dup(0)
STACKS ENDS

CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
        MOV AX,DATAS
        MOV DS,AX
        
        MOV BX,OFFSET NUMBER
        xor cx,cx   ;清0
        mov cl,[bx] ;取第一个字节的值
        cmp cl,0    ;小于等于0吗?
        jbe exit    ;如果是,就退出(假设默认NUMBER是无符号整数数组)
        xor al,al   ;ax用来存和,初值为0 (al容量太小了,容易溢出,但count就一个字节,也只好认了)
again:
        inc bx
        add al,[bx]
        loop again
        
        mov [count],al ;存结果
exit:        
        MOV AX,4C00H
        INT 21H
CODES ENDS
        END START

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

引用 2 楼 gsy999 的回复:
引用楼主 sanjiuailuoluo 的回复:
do mo a ri ga do 
第一个 从0500H这个单元起的1000个数,找出最小的,放入1000H中
Assembly code
[size=18px]
DATAS SEGMENT
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
  ASSUME CS:CODES……

发现错误:mov [count],cx 存结果的语句要放在exit:后面

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

引用 3 楼 gsy999 的回复:
引用 2 楼 gsy999 的回复:
引用楼主 sanjiuailuoluo 的回复:
do mo a ri ga do 
第一个 从0500H这个单元起的1000个数,找出最小的,放入1000H中
Assembly code
[size=18px]
DATAS SEGMENT
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMEN……

存放结果的语句放在exit:后面,在逻辑上还是有点小毛病的:那就是当cx一开始就为0时,也从exit:跳出...,希望LZ能发现并纠正.因为程序没设计输出,所以不好发现存在的问题.


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