[组装]我该如何循环? [英] [Assembly] How do I loop this?

查看:85
本文介绍了[组装]我该如何循环?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在处理一些汇编代码,因此需要分隔WORD变量的数字(12345).我已完成此操作,但不确定如何循环此操作:

I was working on some Assembly code, and I need to separate the digits of my WORD variable (12345). I''ve done this, and I am unsure as to how to loop this:

org 100h 
 
section .text 
 
start: 
    mov bx, output  ; put address of output into BX
    mov ax, [num]   ; put 16-bit value stored at num in AX
    sub dx, dx      ; let DX = 0
 
    mov cx, 10000   ; Divide AX by 10000
    div cx          ; result in AX, remainder in DX
    add al, 30h     ; ASCII '1' = 49 (or 31h) so add 30h
    mov [bx], al    ; Store ASCII char in output
    inc bx          ; point to next char in output
    mov ax, dx      ; move remainder of last division into AX
    sub dx, dx      ; clear remainder
 
    mov cx, 1000    ; Divide AX by 1000
    div cx
    add al, 30h
    mov [bx], al
    inc bx
    mov ax, dx
    sub dx, dx
 
    mov cx, 100     ; Divide AX by 100
    div cx
    add al, 30h
    mov [bx], al
    inc bx
    mov ax, dx
    sub dx, dx
 
    mov cx, 10      ; Divide AX by 10
    div cx
    add al, 30h
    mov [bx], al
    inc bx
    mov ax, dx
    sub dx, dx

    mov cx, 1
    div cx
    add al, 30h
    mov [bx], al
   
    mov bx, output  ; get address of first char in ouput
 
myloop:
    mov dl, [bx]    ; get char at address in BX 
    inc bx          ; point BX to next char in message
    cmp dl, 0       ; Is DL = null (that is, 0)?
    je  quit        ; If yes, then quit
    mov ah, 06      ; If no, then call int 21h service 06h
    int 21h         ;    to print the character 
    jmp myloop      ; Repeat for the next character
 
quit:
    ; DONE!
    int 20h
 
section .data 
    num dw  12345
    output  db  0,0,0,0,0,0

推荐答案

而不是先除以10000,再除以1000,然后再除以100,...更通常的方法是每次均除以10,然后向后输出字节-最不重要的优先.这样,您可以更灵活地处理数字.然后,您将指针返回到最高有效字节,并且仅在剩下数字要做的情况下才循环. IE.您的循环终止测试(在完成每个数字后完成)为AX等于零.在每位数字之后进行测试意味着您将始终至少输出一位数字-因此零输入将导致一位数字零输出.
Instead of dividing by 10000, then 1000, then 100,... the more normal way is to divide by 10 each time and output the bytes backwards - least significant first. This way, you can cope with numbers more flexibly. You then return a pointer to the most significant byte and only loop while you have digits left to do. I.e. your loop termination test (done after doing each digit) is AX equals zero. Doing the test after each digit means you will always output at least one digit - so a zero input causes a single digit zero output.


这篇关于[组装]我该如何循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆